实现一个简单的记事本,可以使用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();
}