用 Qt 编写一个简单的记事本应用
在本篇博客中,我们将使用 Qt 框架开发一个简单的桌面应用——记事本(Notepad)。这个小项目将帮助你掌握如下几个 Qt 编程的基本能力:
- 如何继承
QMainWindow
创建主窗口 - 如何添加菜单栏和菜单项
- 如何使用
QTextEdit
实现文本显示与编辑 - 如何使用
QFileDialog
实现文件打开功能 - 如何处理用户交互(通过
QAction
和 lambda)
🛠️ 功能概述
我们的程序是一个简易的文本阅读器,支持从文件系统中打开 .txt
文件,并将内容显示在编辑区中。其核心功能:
- 提供 “File | Open” 菜单项
- 弹出文件选择对话框
- 打开并读取所选文本文件内容
- 显示在中央文本编辑框中
📁 项目结构
项目包含以下三个主要文件:
├── main.cpp ├── notepad_window.h └── notepad_window.cpp
🔍 代码讲解
1️⃣ main.cpp
- 启动入口
#include <QApplication>
#include "notepad_window.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
NotepadWindow window;
window.show();
return app.exec();
}
这是标准的 Qt 应用程序入口,创建 QApplication 实例,显示主窗口,并进入事件循环。
⸻
2️⃣ notepad_window.h - 主窗口类定义
#ifndef NOTEPAD_WINDOW_H
#define NOTEPAD_WINDOW_H
#include <QMainWindow>
#include <QTextEdit>
#include <QFileDialog>
#include <QMessageBox>
#include <QMenuBar>
#include <QAction>
class NotepadWindow : public QMainWindow
{
Q_OBJECT
public:
NotepadWindow(QWidget* parent = nullptr);
~NotepadWindow();
private:
// 成员变量可放这里(比如 textEdit)
};
#endif
我们继承 QMainWindow 创建了自己的窗口类,添加了 Qt 信号槽机制所需的 Q_OBJECT 宏。
⸻
3️⃣ notepad_window.cpp - 主窗口实现
#include "notepad_window.h"
NotepadWindow::NotepadWindow(QWidget* parent) : QMainWindow(parent)
{
setWindowTitle("Qt Notepad");
QTextEdit* textEdit = new QTextEdit(this);
setCentralWidget(textEdit);
QMenu* fileMenu = menuBar()->addMenu("File");
QAction* openAction = fileMenu->addAction("Open");
connect(openAction, &QAction::triggered, this, [textEdit]() {
QString fileName = QFileDialog::getOpenFileName(nullptr, "Open File", "", "Text Files (*.txt);;All Files (*)");
QFile file(fileName);
if (!fileName.isEmpty() && file.open(QIODevice::ReadOnly | QIODevice::Text)) {
textEdit->setPlainText(QTextStream(&file).readAll());
} else if (!fileName.isEmpty()) {
QMessageBox::warning(nullptr, "Error", "Could not open file for reading.");
}
});
}
NotepadWindow::~NotepadWindow()
{
// 析构函数(如果需要资源释放)
}
几个重点说明:
• QTextEdit 是主编辑区域,用于显示文本
• QMenuBar + QAction 构建菜单
• QFileDialog::getOpenFileName 用于弹出文件选择窗口
• 使用 lambda 表达式连接 QAction::triggered 信号,实现文件读取逻辑
🧪 测试文件
可以准备一个名为 input.txt 的文本文件,内容如:
这是一个测试文件。
用于展示 Qt Notepad 的读取功能。
打开后应该在窗口中正常显示。
⸻
📌 总结
通过这个 mini 项目,我们复习和实践了 Qt GUI 编程中的几个常用组件与方法。它不仅是一个很好的入门练习,也为后续开发更复杂的文本编辑器(如支持多标签、多格式等)奠定了基础。
你可以尝试将该程序扩展为支持 Markdown 或语法高亮的编辑器,进一步加深对 Qt 的理解。
如你对这段代码有任何疑问,欢迎留言交流!
⸻
By Cal
read more