• 使用QT实现一个简单的记事本(C++)


    实现一个简单的记事本,可以使用Qt中的QTextEditQMenu。下面是一个基于这两个类的示例代码

    createMenus()函数中,首先创建了一个QMenuBar对象,并添加了“文件”和“编辑”两个菜单。在“文件”菜单中,创建了“新建”、“打开”、“保存”、“另存为”和“退出”五个动作,并连接到相应的槽函数。在“编辑”菜单中,使用QTextEdit提供的默认动作来实现撤销、重做、剪切、复制和粘贴功能。

    实现“新建”、“打开”、“保存”和“另存为”功能时,可以使用QFileDialog类来打开文件对话框,获取用户选择的文件名或路径。使用QFile类来读写文件内容,使用QTextStream类来进行文本操作。在实现“退出”功能时,可以重写closeEvent()函数,当文档被修改时弹出提示框询问用户是否保存修改。如果用户选择保存,会调用保存文件的槽函数进行保存操作。

    编译运行后,你将看到一个简单的记事本窗口,可以使用菜单栏中的动作进行文件的新建、打开、保存和另存为操作,同时也可以进行编辑操作。

    cpp

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. class Notepad : public QWidget {
    10. public:
    11. Notepad(QWidget *parent = nullptr) : QWidget(parent) {
    12. setWindowTitle("记事本");
    13. resize(400, 300);
    14. QVBoxLayout *layout = new QVBoxLayout(this);
    15. textEdit = new QTextEdit(this);
    16. layout->addWidget(textEdit);
    17. createMenus();
    18. }
    19. private:
    20. QTextEdit *textEdit;
    21. QString currentFile;
    22. void createMenus() {
    23. QMenuBar *menuBar = new QMenuBar(this);
    24. QMenu *fileMenu = menuBar->addMenu("文件");
    25. QAction *newAction = new QAction("新建", this);
    26. fileMenu->addAction(newAction);
    27. connect(newAction, &QAction::triggered, this, &Notepad::newFile);
    28. QAction *openAction = new QAction("打开", this);
    29. fileMenu->addAction(openAction);
    30. connect(openAction, &QAction::triggered, this, &Notepad::openFile);
    31. QAction *saveAction = new QAction("保存", this);
    32. fileMenu->addAction(saveAction);
    33. connect(saveAction, &QAction::triggered, this, &Notepad::saveFile);
    34. QAction *saveAsAction = new QAction("另存为", this);
    35. fileMenu->addAction(saveAsAction);
    36. connect(saveAsAction, &QAction::triggered, this, &Notepad::saveFileAs);
    37. QAction *exitAction = new QAction("退出", this);
    38. fileMenu->addAction(exitAction);
    39. connect(exitAction, &QAction::triggered, this, &Notepad::close);
    40. QMenu *editMenu = menuBar->addMenu("编辑");
    41. QAction *undoAction = textEdit->undoAction();
    42. editMenu->addAction(undoAction);
    43. QAction *redoAction = textEdit->redoAction();
    44. editMenu->addAction(redoAction);
    45. QAction *cutAction = textEdit->cutAction();
    46. editMenu->addAction(cutAction);
    47. QAction *copyAction = textEdit->copyAction();
    48. editMenu->addAction(copyAction);
    49. QAction *pasteAction = textEdit->pasteAction();
    50. editMenu->addAction(pasteAction);
    51. setMenuBar(menuBar);
    52. }
    53. void newFile() {
    54. textEdit->clear();
    55. currentFile.clear();
    56. }
    57. void openFile() {
    58. QString fileName = QFileDialog::getOpenFileName(this, "打开文件", ".", "文本文件(*.txt)");
    59. if (!fileName.isEmpty()) {
    60. QFile file(fileName);
    61. if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    62. QTextStream in(&file);
    63. textEdit->setText(in.readAll());
    64. currentFile = fileName;
    65. file.close();
    66. }
    67. }
    68. }
    69. void saveFile() {
    70. if (currentFile.isEmpty()) {
    71. saveFileAs();
    72. } else {
    73. QFile file(currentFile);
    74. if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    75. QTextStream out(&file);
    76. out << textEdit->toPlainText();
    77. file.close();
    78. }
    79. }
    80. }
    81. void saveFileAs() {
    82. QString fileName = QFileDialog::getSaveFileName(this, "另存为", ".", "文本文件(*.txt)");
    83. if (!fileName.isEmpty()) {
    84. QFile file(fileName);
    85. if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    86. QTextStream out(&file);
    87. out << textEdit->toPlainText();
    88. currentFile = fileName;
    89. file.close();
    90. }
    91. }
    92. }
    93. void closeEvent(QCloseEvent *event) override {
    94. if (textEdit->document()->isModified()) {
    95. QMessageBox::StandardButton result =
    96. QMessageBox::warning(this, "保存修改", "文档已被修改,是否保存?",
    97. QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    98. if (result == QMessageBox::Save) {
    99. saveFile();
    100. } else if (result == QMessageBox::Cancel) {
    101. event->ignore();
    102. return;
    103. }
    104. }
    105. QWidget::closeEvent(event);
    106. }
    107. };
    108. int main(int argc, char *argv[]) {
    109. QApplication app(argc, argv);
    110. Notepad notepad;
    111. notepad.show();
    112. return app.exec();
    113. }

  • 相关阅读:
    一种跳板机的实现思路
    学开发语言 求职互联网行业的未来发展
    浏览器事件循环
    SpringBoot整合SQLite
    UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes
    迁移学习——ResNet152
    【C++ 学习 ㉒】- 超详解 AVL 树的插入、平衡调整以及删除(含源代码)
    Rust权威指南之泛型、trait和生命周期
    RISC-V架构的函数调用规范和栈布局
    video caption with frame selection【论文阅读】
  • 原文地址:https://blog.csdn.net/qrsxiaojie/article/details/132661851