QT 框架学习笔记
基本知识
- Qt是一个跨平台的C++图形用户界面应用程序框架
- Qt使用信号和槽(Signal & Slot)机制来处理对象之间的通信
- 主要包含:窗口部件(Widgets)、布局管理、事件系统等
- 支持Windows、Linux、macOS等。它不仅能做GUI,还能做网络、多媒体、数据库等开发。
2. Qt项目结构
- .pro 文件:Qt的工程配置文件,类似于CMakeLists.txt。
- main.cpp:程序入口,创建应用对象和主窗口。
- mainwindow.h/cpp:主窗口类的声明和实现。
- ui/ 目录(可选):存放Qt Designer生成的UI文件。
3. Qt的核心类
- QApplication:应用程序对象,管理应用生命周期。
- QMainWindow:主窗口类,常用于桌面应用。
- QWidget:所有可视控件的基类。
- QPushButton、QLabel、QVBoxLayout等:常用控件和布局
4. Qt模块
Qt Core:核心非GUI功能,如文件处理、数据结构、线程等。
Qt GUI:图形用户界面模块,包括窗口、控件、事件等。
Qt Widgets:传统桌面应用程序的UI组件。
Qt Quick:用于构建流畅的用户界面的声明式框架。
Qt Network:网络编程模块,支持TCP/IP、HTTP、FTP等。
Qt Multimedia:多媒体处理模块,支持音频、视频播放等。
Qt框架的信号与槽(Signals and Slots)是其核心机制,用于实现对象间的松耦合通信。信号在特定事件(如按钮点击)发生时被触发,槽则是响应信号的函数。以下是详细介绍和示例:
5. 信号与槽
- 信号(Signal):
- 由对象在事件发生时发出(如
QPushButton::clicked()
)。 - 声明在类的
signals:
区域,无需实现。
- 由对象在事件发生时发出(如
- 槽(Slot):
- 普通成员函数,用于处理信号。
- 声明在
public slots:
、private slots:
或protected slots:
区域。
- 连接(Connect):
- 通过
QObject::connect()
绑定信号与槽,支持跨线程通信
- 通过
例子1#include <QApplication>
#include <QPushButton>
#include <QObject>class MyButton : public QPushButton
{Q_OBJECT
public:MyButton(QWidget *parent = nullptr) : QPushButton("Click Me", parent){connect(this, &QPushButton::clicked, this, &MyButton::handleClicked);}public slots:void handleClicked(){qDebug("Button clicked!");}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);MyButton button;button.resize(200, 100);button.show();return app.exec();
}例子2int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton button("Click Me");button.resize(200, 50);// 连接按钮的clicked信号到Lambda槽QObject::connect(&button, &QPushButton::clicked, []() {QMessageBox::information(nullptr, "提示", "按钮被点击!");});button.show();return app.exec();
}1.创建按钮QPushButton。
2.使用connect将按钮的clicked()信号连接到Lambda表达式(匿名槽)。
3.点击按钮时,触发Lambda弹出消息框
6.高级主题
多线程编程
Qt提供了QThread类,用于创建和管理线程。
- 线程管理:
QThread
提供线程生命周期控制(start()
/quit()
/wait()
)。 - 事件循环:默认
run()
调用exec()
进入事件循环,支持信号槽跨线程通信。 - 线程安全:需用
QMutex
、QReadWriteLock
等同步共享资源。
#include <QApplication>
#include <QThread>
#include <QPushButton>
#include <QObject>
#include <QDebug>class Worker : public QObject
{Q_OBJECT
public slots:void doWork(){qDebug("Work started");// 模拟工作QThread::sleep(2);qDebug("Work finished");}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);QPushButton button("Start Work");QThread thread;Worker worker;worker.moveToThread(&thread);QObject::connect(&button, &QPushButton::clicked, &worker, &Worker::doWork);QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);QObject::connect(&worker, &Worker::finished, &thread, &QThread::quit);QObject::connect(&worker, &Worker::finished, &worker, &Worker::deleteLater);QObject::connect(&thread, &QThread::finished, &thread, &QThread::deleteLater);button.show();thread.start();return app.exec();
}
数据库编程
Qt提供了Qt SQL模块,用于数据库操作。
#include <QApplication>
#include <QtSql>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("example.db");if (!db.open()) {qDebug("Failed to open database");return -1;}QSqlQuery query;query.exec("CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT)");query.exec("INSERT INTO person (name) VALUES ('Alice')");query.exec("INSERT INTO person (name) VALUES ('Bob')");QSqlQuery selectQuery("SELECT * FROM person");while (selectQuery.next()) {qDebug() << selectQuery.value(0).toInt() << selectQuery.value(1).toString();}db.close();return 0;
}