1、connect()函數實現的是信號與槽的關聯。
注意:只有QO bject類及其派生的類才能使用信號和槽的機制
2、函數原型
static QMetaObject::Connection connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);
static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,const QObject *receiver, const QMetaMethod &method,
Qt::ConnectionType type = Qt::AutoConnection);
inline QMetaObject::Connection connect(const QObject *sender, const char *signal,const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;
在第一個函數中:第一個參數為發射信號的對象,例如后面的dlg;第二個參數是要發射的信號,例如后面的SIGNAL(dlgReturn(int));
第三個參數是接受信號的對象,例如后面的this,表明是本部件,即Widget,當這個參數是this時,可以將其省略掉,因為在第三個函數中,該參數默認為this;第四個參數是要執行的槽,例如
后面的SLOT(showValue(int)),也可以指定一個信號,實現信號與信號的關聯。
eg:
MyDialog *dlg=new MyDialog(this);//將對話框中的自定義信號與主界面中的自定義槽進行關聯
connect(dlg,SIGNAL(dlgReturn(int)),this,SLOT(showValue(int)));
dlg->show();
注意:
1、對於信號與槽,必須使用SIGNAL()和SLOT()宏,它們將參數轉化為const char *類型
2、第四個參數指定的槽聲明時必須使用slots關鍵字。
eg:
private slots://槽的聲明
void showValue(int value);
void on_label_linkActivated(const QString &link);
Qt中的connect信號和槽不在同一個線程
主線程中發出一個信號,另一個線程槽函數沒有響應,這個問題搞了好幾個小時,才發現原來是connect時候的第5個參數寫錯了,在這里做下備注吧。
connect用於連接qt的信號和槽,在qt編程過程中不可或缺。它其實有第五個參數,只是一般使用默認值,在滿足某些特殊需求的時候可能需要手動設置。
Qt::AutoConnection: 默認值,使用這個值則連接類型會在信號發送時決定。如果接收者和發送者在同一個線程,則自動使用Qt::DirectConnection類型。如果接收者和發送者不在一個線程,則自動使用Qt::QueuedConnection類型。
Qt::DirectConnection:槽函數會在信號發送的時候直接被調用,槽函數運行於信號發送者所在線程。效果看上去就像是直接在信號發送位置調用了槽函數。這個在多線程環境下比較危險,可能會造成奔潰。
Qt::QueuedConnection:槽函數在控制回到接收者所在線程的事件循環時被調用,槽函數運行於信號接收者所在線程。發送信號之后,槽函數不會立刻被調用,等到接收者的當前函數執行完,進入事件循環之后,槽函數才會被調用。多線程環境下一般用這個。
Qt::BlockingQueuedConnection:槽函數的調用時機與Qt::QueuedConnection一致,不過發送完信號后發送者所在線程會阻塞,直到槽函數運行完。接收者和發送者絕對不能在一個線程,否則程序會死鎖。在多線程間需要同步的場合可能需要這個。
Qt::UniqueConnection:這個flag可以通過按位或(|)與以上四個結合在一起使用。當這個flag設置時,當某個信號和槽已經連接時,再進行重復的連接就會失敗。也就是避免了重復連接。