实现一个简单的记事本,可以使用Qt中的QTextEdit和QMenu。下面是一个基于这两个类的示例代码:
在createMenus()函数中,首先创建了一个QMenuBar对象,并添加了“文件”和“编辑”两个菜单。在“文件”菜单中,创建了“新建”、“打开”、“保存”、“另存为”和“退出”五个动作,并连接到相应的槽函数。在“编辑”菜单中,使用QTextEdit提供的默认动作来实现撤销、重做、剪切、复制和粘贴功能。
实现“新建”、“打开”、“保存”和“另存为”功能时,可以使用QFileDialog类来打开文件对话框,获取用户选择的文件名或路径。使用QFile类来读写文件内容,使用QTextStream类来进行文本操作。在实现“退出”功能时,可以重写closeEvent()函数,当文档被修改时弹出提示框询问用户是否保存修改。如果用户选择保存,会调用保存文件的槽函数进行保存操作。
编译运行后,你将看到一个简单的记事本窗口,可以使用菜单栏中的动作进行文件的新建、打开、保存和另存为操作,同时也可以进行编辑操作。
cpp
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
- class Notepad : public QWidget {
- public:
- Notepad(QWidget *parent = nullptr) : QWidget(parent) {
- setWindowTitle("记事本");
- resize(400, 300);
-
- QVBoxLayout *layout = new QVBoxLayout(this);
-
- textEdit = new QTextEdit(this);
- layout->addWidget(textEdit);
-
- createMenus();
- }
-
- private:
- QTextEdit *textEdit;
- QString currentFile;
-
- void createMenus() {
- QMenuBar *menuBar = new QMenuBar(this);
-
- QMenu *fileMenu = menuBar->addMenu("文件");
- QAction *newAction = new QAction("新建", this);
- fileMenu->addAction(newAction);
- connect(newAction, &QAction::triggered, this, &Notepad::newFile);
-
- QAction *openAction = new QAction("打开", this);
- fileMenu->addAction(openAction);
- connect(openAction, &QAction::triggered, this, &Notepad::openFile);
-
- QAction *saveAction = new QAction("保存", this);
- fileMenu->addAction(saveAction);
- connect(saveAction, &QAction::triggered, this, &Notepad::saveFile);
-
- QAction *saveAsAction = new QAction("另存为", this);
- fileMenu->addAction(saveAsAction);
- connect(saveAsAction, &QAction::triggered, this, &Notepad::saveFileAs);
-
- QAction *exitAction = new QAction("退出", this);
- fileMenu->addAction(exitAction);
- connect(exitAction, &QAction::triggered, this, &Notepad::close);
-
- QMenu *editMenu = menuBar->addMenu("编辑");
- QAction *undoAction = textEdit->undoAction();
- editMenu->addAction(undoAction);
-
- QAction *redoAction = textEdit->redoAction();
- editMenu->addAction(redoAction);
-
- QAction *cutAction = textEdit->cutAction();
- editMenu->addAction(cutAction);
-
- QAction *copyAction = textEdit->copyAction();
- editMenu->addAction(copyAction);
-
- QAction *pasteAction = textEdit->pasteAction();
- editMenu->addAction(pasteAction);
-
- setMenuBar(menuBar);
- }
-
- void newFile() {
- textEdit->clear();
- currentFile.clear();
- }
-
- void openFile() {
- QString fileName = QFileDialog::getOpenFileName(this, "打开文件", ".", "文本文件(*.txt)");
- if (!fileName.isEmpty()) {
- QFile file(fileName);
- if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QTextStream in(&file);
- textEdit->setText(in.readAll());
- currentFile = fileName;
- file.close();
- }
- }
- }
-
- void saveFile() {
- if (currentFile.isEmpty()) {
- saveFileAs();
- } else {
- QFile file(currentFile);
- if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
- QTextStream out(&file);
- out << textEdit->toPlainText();
- file.close();
- }
- }
- }
-
- void saveFileAs() {
- QString fileName = QFileDialog::getSaveFileName(this, "另存为", ".", "文本文件(*.txt)");
- if (!fileName.isEmpty()) {
- QFile file(fileName);
- if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
- QTextStream out(&file);
- out << textEdit->toPlainText();
- currentFile = fileName;
- file.close();
- }
- }
- }
-
- void closeEvent(QCloseEvent *event) override {
- if (textEdit->document()->isModified()) {
- QMessageBox::StandardButton result =
- QMessageBox::warning(this, "保存修改", "文档已被修改,是否保存?",
- QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
- if (result == QMessageBox::Save) {
- saveFile();
- } else if (result == QMessageBox::Cancel) {
- event->ignore();
- return;
- }
- }
-
- QWidget::closeEvent(event);
- }
- };
-
- int main(int argc, char *argv[]) {
- QApplication app(argc, argv);
-
- Notepad notepad;
- notepad.show();
-
- return app.exec();
- }