在很多初学者眼中,C++ 更像是一门用于控制台、系统或嵌入式的语言。但实际上,借助 Qt 等强大的 GUI 框架,C++ 同样可以胜任跨平台、高性能的桌面图形应用开发。
Qt 是一个成熟的 C++ GUI 框架,拥有丰富的控件、跨平台支持、信号槽机制等特性,被广泛应用于 Linux 桌面、嵌入式系统和商业软件开发中。
本篇文章将从 Qt 的基本概念入手,逐步带你构建一个完整的图形界面应用:任务管理器(To-Do List),并介绍 Qt 编程核心机制、界面设计技巧、项目结构组织、数据持久化等实战能力。
cpp复制编辑#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QLabel label("Hello, Qt!");
label.show();
return app.exec();
}QApplication 是所有 GUI 应用的核心入口
QLabel 是最简单的文本控件
show() 显示窗口
exec() 进入事件循环
text复制编辑TodoApp/
├── main.cpp
├── mainwindow.ui
├── mainwindow.cpp
├── mainwindow.h
├── taskmodel.h / cpp
├── taskdialog.h / cpp
├── resources.qrc
├── TodoApp.pro.ui 文件:使用 Qt Designer 创建界面
.pro 文件:项目配置,用于 Qt 编译系统 qmake
.qrc:资源文件,管理图标、图片、字体
实现一个简洁的 To-Do List 应用,功能包括:
使用 Qt Designer 拖拽生成:
QTableWidget:显示任务表格
QPushButton:添加、删除、保存、加载
QLineEdit / QTextEdit:输入任务
QDialog:弹窗添加任务
cpp复制编辑// taskdialog.h
#include <QDialog>
#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
class TaskDialog : public QDialog {
Q_OBJECT
public:
TaskDialog(QWidget *parent = nullptr);
QString title() const;
QString description() const;
QString priority() const;
private:
QLineEdit *titleEdit;
QTextEdit *descEdit;
QComboBox *priorityCombo;
};cpp复制编辑// taskdialog.cpp
#include "taskdialog.h"
#include <QVBoxLayout>
#include <QPushButton>
TaskDialog::TaskDialog(QWidget *parent) : QDialog(parent) {
titleEdit = new QLineEdit(this);
descEdit = new QTextEdit(this);
priorityCombo = new QComboBox(this);
priorityCombo->addItems({"Low", "Medium", "High"});
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(titleEdit);
layout->addWidget(descEdit);
layout->addWidget(priorityCombo);
QPushButton *okBtn = new QPushButton("OK");
connect(okBtn, &QPushButton::clicked, this, &TaskDialog::accept);
layout->addWidget(okBtn);
}
QString TaskDialog::title() const { return titleEdit->text(); }
QString TaskDialog::description() const { return descEdit->toPlainText(); }
QString TaskDialog::priority() const { return priorityCombo->currentText(); }cpp复制编辑void MainWindow::on_addTask_clicked() {
TaskDialog dialog(this);
if (dialog.exec() == QDialog::Accepted) {
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
ui->tableWidget->setItem(row, 0, new QTableWidgetItem(dialog.title()));
ui->tableWidget->setItem(row, 1, new QTableWidgetItem(dialog.description()));
ui->tableWidget->setItem(row, 2, new QTableWidgetItem(dialog.priority()));
}
}cpp复制编辑void MainWindow::on_deleteTask_clicked() {
auto selected = ui->tableWidget->currentRow();
if (selected >= 0) {
ui->tableWidget->removeRow(selected);
}
}cpp复制编辑#include <QFile>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
void MainWindow::saveToFile() {
QJsonArray taskArray;
for (int i = 0; i < ui->tableWidget->rowCount(); ++i) {
QJsonObject task;
task["title"] = ui->tableWidget->item(i, 0)->text();
task["desc"] = ui->tableWidget->item(i, 1)->text();
task["priority"] = ui->tableWidget->item(i, 2)->text();
taskArray.append(task);
}
QFile file("tasks.json");
file.open(QIODevice::WriteOnly);
file.write(QJsonDocument(taskArray).toJson());
file.close();
}Qt 中的信号槽机制是一种类型安全的回调机制:
cpp复制编辑connect(sender, SIGNAL(signalName()), receiver, SLOT(slotName()));或现代语法(推荐):
cpp复制编辑connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);无需关心指针/函数匹配,Qt 会自动连接事件响应。
在项目目录下执行:
bash复制编辑qmake TodoApp.pro
make
./TodoApp或使用 Qt Creator 直接运行。
.qrc)统一管理图标和样式
QAbstractTableModel 构建 MVC 架构
QTimer、QProcess、QFileSystemWatcher 等 Qt 核心类
通过 Qt,C++ 程序员可以快速脱离命令行世界,进入图形交互编程的领域。本篇文章通过构建一个 To-Do List 桌面程序,系统介绍了 Qt 编程的常用组件、信号槽机制、数据管理方式、文件保存技术等,助你掌握完整的 GUI 项目开发流程。
下一步建议:
QGraphicsView 构建绘图应用
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。