qt 訊號槽機制

2021-10-04 06:37:44 字數 1607 閱讀 1038

訊號:

signals:    

void startgetdatathread();

void sendpointer(mainwindow*);

宣告乙個訊號要使用signals關鍵字。

在signals前面不能使用public、private和protected等限定符,因為只有定義該訊號的類及其子類才可以發射該訊號。(個人理解為使用emit函式)

訊號只用宣告,不需要也不能對它進行定義實現。

訊號沒有返回值,只能是void型別的。

只有qobject類及其子類派生的類才能使用訊號和槽機制,使用訊號和槽,還必須在類宣告的最開始處新增q_object巨集。

使用emit 強行發射訊號

emit sendpointer(this);

宣告乙個槽需要使用slots關鍵字。乙個槽可以是private、public或者protected型別的,槽也可以被宣告為虛函式,這與普通的成員函式是一樣的,也可以像呼叫乙個普通函式一樣來呼叫槽。

public slots:

void handletimeout();

void getdatafromrtdb();

void getpointer(mainwindow *pmainwindow);

connect()函式

connect()函式原型如下:

bool qobject::connect ( const qobject * sender, const char * signal, const qobject * receiver, const char * method, qt::connectiontype type = qt::autoconnection )

有兩種方式表達:

1.mydialog *dlg = new mydialog(this); 

connect(dlg,signal(dlgreturn(int)),this,slot(showvalue(int)));

connect(this,signal(sendpointer(mainwindow*)),m_pgetdatathreadobj,slot(getpointer(mainwindow*)));

2.connect(this,&mainwindow::startgetdatathread,m_pgetdatathreadobj,&datathreadobject::getdatafromrtdb); connect(m_pgetdatathread,&qthread::finished,m_pgetdatathread,&qobject::deletelater);

訊號和槽的引數只能有型別,不能有變數,例如寫成slot(showvalue(int value))是不對的。

對於訊號和槽的引數問題,基本原則是訊號中的引數型別要和槽中的引數型別相對應,而且訊號中的引數可以多於槽中的引數,但是不能反過來,如果訊號中有多餘的引數,那麼它們將被忽略。

因為預設是 等於qt::autoconnection,所以一般情況不需要設定。

在槽函式中獲取發射訊號的物件 函式為:

qobject *sender() const;

Qt訊號槽機制

c 的rtti機制功能有限 qt提供了元物件系統,使用該系統的基類qobject所建立和派生的類,可以再執行期獲取該物件的類名 父 類名,成員變數資訊,成員函式資訊,進而實現訊號槽機制。c 模擬 類定義檔案 object.h 1.ifndef db object 2.define db object...

QT訊號與槽機制

qt訊號與槽 posted on 2010 04 08 15 37 feisky 訊號與槽作為qt的核心機制在qt程式設計中有著廣泛的應用,本文介紹了訊號與槽的一些基本概念 元物件工具以及在實際使用過程中應注意的一些問題。qt是乙個跨平台的c gui應用構架,它提供了豐富的視窗部件集,具有物件導向 ...

Qt 訊號與槽機制

下部分 來自於我自己新增了傳遞引數的部分 ifndef my object define my object include define my slots define my signals protected define my emit class myobject struct metaob...