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

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

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();
}

你可能感兴趣的:(qt,c++,开发语言)