QT 框架学习笔记

06-01 1439阅读

基本知识

  1. Qt是一个跨平台的C++图形用户界面应用程序框架
  2. Qt使用信号和槽(Signal & Slot)机制来处理对象之间的通信
  3. 主要包含:窗口部件(Widgets)、布局管理、事件系统等
  4. 支持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类,用于创建和管理线程。

                          1. ​​线程管理​​:QThread提供线程生命周期控制(start()/quit()/wait())。
                          2. ​​事件循环​​:默认run()调用exec()进入事件循环,支持信号槽跨线程通信。
                          3. ​​线程安全​​:需用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() 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码