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 #include #include 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(); } 例子2 int 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 #include #include #include #include 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 #include #include 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()
- 通过QObject::connect()绑定信号与槽,支持跨线程通信
- 信号(Signal):
- QPushButton、QLabel、QVBoxLayout等:常用控件和布局
- QWidget:所有可视控件的基类。
- QMainWindow:主窗口类,常用于桌面应用。
- QApplication:应用程序对象,管理应用生命周期。
- ui/ 目录(可选):存放Qt Designer生成的UI文件。
- mainwindow.h/cpp:主窗口类的声明和实现。
- main.cpp:程序入口,创建应用对象和主窗口。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。