日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中的消息处理

發布時間:2025/4/5 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中的消息处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 Qt中的消息處理簡單介紹

1.1Qt消息模型

Qt消息模型:

  • Qt封裝了具體操作系統的消息機制。
  • Qt遵循經典的GUI消息驅動事件模型。

思考如下幾個問題:

  • Qt中如何表示用戶消息?
  • Qt中如何映射用戶消息到消息處理函數?
  • Qt中消息映射需要遵循什么規則?

1.2 信號與槽

Qt中定義了與系統消息相關的概念:

  • 信號(Signal):
    • 由操作系統產生的消息。
  • 槽(Slot):
    • 程序中的消息處理函數。
  • 連接(Connect):
    • 將系統消息綁定到消息處理函數。

Qt中的消息處理機制:

Qt的核心–QObject::connect函數:

Qt中的“新”關鍵字:

  • SIGNAL:
    • 用于指定消息名。
  • SLOT:
    • 用于指定消息處理函數名。
  • Q_OBJECT:
    • 所有自定義槽的類必須在類聲明的開始處加上Q_OBJECT。
  • slots:
    • 用于在類中聲明消息處理函數。

自定義槽:

  • 只有QObject的子類才能自定義槽。
  • 定義槽的類必須在聲明的最開始使用Q_OBJECT。
  • 類中聲明槽時需要使用slots關鍵字。
  • 槽與所處理的信號在函數簽名上必須一致。
  • SIGNAL和SLOT所指定的名稱中:
    • 可以包含參數類型。
    • 不能包含具體的參數名。

解決經典問題:Object::connect:No such slot …

  • 檢查類是否繼承于QObject。
  • 檢查類聲明的開始是否添加Q_OBJECT。
  • 檢查是否使用slots關鍵字進行槽聲明。
  • 檢查槽的名稱是否拼寫錯誤。
  • 重新執行qmake。
  • 編程實驗:信號與槽初步使用

    #include <QtGui/QApplication> #include <QPushButton>int main(int argc, char *argv[]) {QApplication a(argc, argv);QPushButton b;b.setText("Click me to quit!");b.show();QObject::connect(&b, SIGNAL(clicked()), &a, SLOT(quit()));return a.exec(); }

    編程實例:自定義槽

    QCalculator.h:

    #ifndef _QCALCULATORUI_H_ #define _QCALCULATORUI_H_#include <QWidget> #include <QLineEdit> #include <QPushButton>class QCalculatorUI : public QWidget {Q_OBJECT private:QLineEdit* m_edit;QPushButton* m_buttons[20];QCalculatorUI();bool construct(); private slots:void onButtonClicked(); public:static QCalculatorUI* NewInstance();void show();~QCalculatorUI(); };#endif

    QCalculator.cpp:

    #include "QCalculatorUI.h" #include <QDebug>QCalculatorUI::QCalculatorUI() : QWidget(NULL, Qt::WindowCloseButtonHint) {}bool QCalculatorUI::construct() {bool ret = true;const char* btnText[20] ={"7", "8", "9", "+", "(","4", "5", "6", "-", ")","1", "2", "3", "*", "<-","0", ".", "=", "/", "C",};m_edit = new QLineEdit(this);if( m_edit != NULL ){m_edit->move(10, 10);m_edit->resize(240, 30);m_edit->setReadOnly(true);}else{ret = false;}for(int i=0; (i<4) && ret; i++){for(int j=0; (j<5) && ret; j++){m_buttons[i*5 + j] = new QPushButton(this);if( m_buttons[i*5 + j] != NULL ){m_buttons[i*5 + j]->resize(40, 40);m_buttons[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);m_buttons[i*5 + j]->setText(btnText[i*5 + j]);connect(m_buttons[i*5 + j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));}else{ret = false;}}}return ret; }QCalculatorUI* QCalculatorUI::NewInstance() {QCalculatorUI* ret = new QCalculatorUI();if( (ret == NULL) || !ret->construct() ){delete ret;ret = NULL;}return ret; }void QCalculatorUI::show() {QWidget::show();setFixedSize(width(), height()); }void QCalculatorUI::onButtonClicked() {QPushButton* btn = (QPushButton*)sender();qDebug() << "onButtonClicked()";qDebug() << btn->text(); }QCalculatorUI::~QCalculatorUI() {}

    2 深入理解信號與槽

    一個事實:

    • 在實際的項目開發中,大多數時候是直接將組件中預定義的信號連接到槽函數;信號發射的時候槽函數被調用。

    深度的思考:

    • 信號是怎么來的?又是如何發射的?

    Qt中信號(SIGNAL)的本質:

    • 信號只是一個特殊的成員函數聲明:

      • 函數的返回值是void類型。
      • 函數只能聲明不能定義。
    • 信號必須使用signals關鍵字進行聲明:

      • 函數的訪問屬性自動被設置為protected。
      • 只能通過emit關鍵字調用函數(發射信號)。

    信號定義示例:

    信號與槽的對應關系:

    信號與槽的關系:

    • 一個信號可以連接到多個槽(一對多)。
    • 多個信號可以連接到一個槽(多對一)。
    • 一個信號可以連接到另一個信號(轉嫁)。
    • 連接可以被disconnect函數刪除(移除)。

    對于信號與槽我們必須注意如下:

  • Qt類只能在頭文件中聲明。
  • 信號與槽的原型應該完全相同。
  • 信號參數多于槽函數時,多余的參數被忽略。
  • 槽函數的返回值必須是void類型。
  • 槽函數可以像普通成員函數一樣被調用。
  • 信號與槽的訪問屬性對于connect/disconnect無效。
  • 信號與槽的意義:

    • 最大限度的弱化了類之間的耦合關系。
    • 在設計階段,可以減少不必要的接口類(抽象類)。
    • 在開發階段,對象間的交互通過信號與槽動態綁定。

    示例代碼:

    RxClass.h:

    #ifndef RXCLASS_H #define RXCLASS_H#include <QObject> #include <QDebug>class RxClass : public QObject {Q_OBJECT public:protected slots:void mySlot(int v){qDebug() << "void mySlot(int v)";qDebug() << "Sender: " << sender()->objectName();qDebug() << "Receiver: " << this->objectName();qDebug() << "Value: " << v;qDebug() << endl;} };#endif // RXCLASS_H

    TestSignal.h:

    #ifndef TESTSIGNAL_H #define TESTSIGNAL_H#include <QObject>class TestSignal : public QObject {Q_OBJECTpublic:void send(int i){emit testSignal(i);}signals:void testSignal(int v);};#endif // TESTSIGNAL_H

    main.cpp:

    #include <QtCore/QCoreApplication> #include <QDebug> #include "TestSignal.h" #include "RxClass.h"void emit_signal() {qDebug() << "emit_signal()" << endl;TestSignal t;RxClass r;t.setObjectName("t");r.setObjectName("r");QObject::connect(&t, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));for(int i=0; i<3; i++){t.send(i);} }void one_to_multi() {qDebug() << "one_to_multi()" << endl;TestSignal t;RxClass r1;RxClass r2;t.setObjectName("t");r1.setObjectName("r1");r2.setObjectName("r2");QObject::connect(&t, SIGNAL(testSignal(int)), &r1, SLOT(mySlot(int)));QObject::connect(&t, SIGNAL(testSignal(int)), &r2, SLOT(mySlot(int)));t.send(100); }void multi_to_one() {qDebug() << "multi_to_one()" << endl;TestSignal t1;TestSignal t2;RxClass r;t1.setObjectName("t1");t2.setObjectName("t2");r.setObjectName("r");QObject::connect(&t1, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));QObject::connect(&t2, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));t1.send(101);t2.send(102); }void signal_to_signal() {qDebug() << "signal_to_signal()" << endl;TestSignal t1;TestSignal t2;RxClass r;t1.setObjectName("t1");t2.setObjectName("t2");r.setObjectName("r");QObject::connect(&t1, SIGNAL(testSignal(int)), &t2, SIGNAL(testSignal(int)));QObject::connect(&t2, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));t1.send(101);t2.send(102); }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// emit_signal();// one_to_multi();// multi_to_one();// signal_to_signal();return a.exec(); }

    參考資料:

  • QT實驗分析教程
  • 總結

    以上是生活随笔為你收集整理的Qt中的消息处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品国产无码在线 | 91猎奇在线观看 | 免费午夜视频 | 黄色片视频免费在线观看 | 亚色视频 | 99热麻豆 | 色视频网站 | 波多野结衣日韩 | 国产精品性色 | 狠狠干欧美 | 老妇女玩小男生毛片 | 美女色网站 | 国产日日操| 久久一区av | 欧美精品一区二区久久婷婷 | 日韩爽爽视频 | 亚洲特级毛片 | 少妇一级免费 | 日本老少交| 美女穴穴 | 另类视频一区 | 精品久久久久久无码国产 | 色婷婷精品视频 | 成人av男人的天堂 | 日本免费一区二区三区最新 | 人人爽人人爽人人爽人人爽 | 麻豆网站在线播放 | 亚欧洲乱码视频 | 精品乱子一区二区三区 | 禁久久精品乱码 | 国产在线麻豆精品观看 | aaa一区二区三区 | 依依成人在线视频 | 国产精品日日夜夜 | 黄色一级免费看 | 一区二区三区四区欧美 | 久久婷婷视频 | 精品999久久久 | 美女一区二区三区四区 | 又大又硬又爽免费视频 | 久久久久久久久久久久国产 | 男人在线天堂 | 国产艳妇疯狂做爰视频 | 住在隔壁的她动漫免费观看全集下载 | 午夜电影一区二区 | av一区二区在线观看 | 国产成人综合在线观看 | 日日草夜夜草 | 天堂资源av| 欧美,日韩,国产在线 | 国产乱妇乱子 | 日韩一级伦理片 | 一区二区三区网站 | 四虎黄色影院 | aaaa一级片| 成人国产一区二区三区 | 又色又爽又高潮免费视频国产 | 亚洲一区 欧美 | 极品美女被c | 黄色1级毛片 | 亚洲av少妇一区二区在线观看 | 国产又粗又长又爽 | 91大神网址| 日韩一区二区视频在线播放 | 日本大尺度吃奶做爰视频 | 综合av| 中文字幕久久综合 | 亚洲色图另类小说 | 国产男男gay体育生网站 | 亚洲欧美精品久久 | 综合亚洲色图 | 国产喷白浆一区二区三区 | 亚洲成人乱码 | 96视频在线观看 | av专区在线 | 无码人妻久久一区二区三区蜜桃 | 日本超碰 | 欧美俄罗斯乱妇 | 丰满熟女人妻一区二区三 | 亚洲欧美综合一区二区 | 无套中出丰满人妻无码 | 高潮毛片7777777毛片 | 国产精品资源在线观看 | 91在线导航| 鲁鲁在线 | 男人天堂a | 天天操天天艹 | 99久久人妻无码中文字幕系列 | 国产欧美精品一区 | 五月婷婷六月激情 | 成人免费在线 | 久久九九国产视频 | 天海翼av在线播放 | 奇米777第四色 | 亚洲三级黄 | 日韩精品在线观看一区二区 | 少妇人妻在线视频 | a毛片毛片av永久免费 | 91久久久精品|