QT使用元對象編譯器(Meta Object Compiler,moc),實現了元對象(Meta Object System,mos)機制,爲標準C++增長了一些特性:編程
- 信號槽機制,用於解決對象之間的通信
- 可查詢可設計的對象屬性
- 強大的事件機制以及事件過濾器
- 基於上下文的字符串翻譯機制(國際化),用 tr() 函數實現
- 複雜的定時器實現,用於在事件驅動的GUI中嵌入可以精確控制的任務集成
- 層次化的可查詢的對象樹,提供一種天然的方式管理對象關係
- 智能指針(QPoint),在對象析構以後自動設爲0,防止野指針
- 可以跨越庫邊界的動態轉換機制
元對象系統是基於如下3個條件:函數
(1)基類QObject:任何須要使用元對象系統功能的類必須繼承自QObject類ui
(2)Q_OBJECT宏:必須在類的私有聲明區聲明Q_OBJECT宏(默認爲private)this
(3)元對象編譯器(Meta-Object Compiler,moc):爲QObject子類實現元對象特性提供必要的代碼spa
QT編程中信號與槽用於處理界面各個組件的交互,相似與MFC的消息循環和綁定翻譯
注意:在使用信號與槽的類中,必須在類的定義中加入宏定義Q_OBJECT設計
信號(Signal)就是在特定狀況下被髮射的時間,相似於鼠標單擊時發生clicked()信號指針
槽(Slot)是對信號響應的函數code
在須要設計槽的控件(觸發控件)上右鍵->轉到槽 對象
或者直接按下F4進入快速選擇信號和槽函數
選擇相應的信號以後就會跳轉到該信號函數
- lineEdit 文本編輯框
textChanged(QString)
testEdited(QString)
- pushButton 按鈕
clicked()
clicked(bool)
pressed()
//helloDialog.h class HelloDialog : public QMainWindow { // 聲明槽函數 private slots: void on_pushButton_clicked(); }
//helloDialog.cpp void HelloDialog::on_pushButton_clicked() { ui->lineEdit->setText("k5"); }
若是不在.ui文件裏面直接綁定,就必須用connect()進行綁定
connect(
ui文件下的控件名稱
控件自帶的信號函數
自定義的對象
自定義的槽函數
)
//helloDialog.h class HelloDialog{ public: void initSignalSlots(); //初始化信號與槽鏈接
// 聲明槽函數 private slots: void changeData(); }
//helloDialog.cpp void HelloDialog::initSignalSlots() { connect(ui->pushButton,SIGNAL(cliked()),this,SLOT(changeData)); } void HelloDialog::changeData(){ ui->lineEdit->setText("k5"); }
除了使用QT內置的信號函數和槽函數,也能夠自定義信號和槽函數.
建立兩個類繼承QObject類,添加Q_Object宏,用signals和slots標記信號和槽函數
// test.h #ifndef TEST_H #define TEST_H #include <QObject> #include <QDebug> class test : public QObject { Q_OBJECT public: test(); void send(){ emit testcall(); } signals: void testcall(); public slots: void testreveive(); } #endif // TEST_H
// test.cpp
#include "test.h" test::test() { } void test::testreceive(){ qDebug() << "receive"; }
// mainwindow.cpp #include "ui_mainwindow.h" #include "test.h" MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { test t; connect(&t, &test::testcall, &t, &test::testreceive); t.send(); }
注意:使用 signals 標記信號函數,信號是一個函數聲明,返回void,不須要實現函數代碼
使用 emit 能夠發送信號