1. 程式人生 > >關於Qt訊號與槽機制中的一些問題

關於Qt訊號與槽機制中的一些問題

一、connect函式的引數

在連線訊號與槽的函式connect中,connect函式的最後一個引數type可以指定傳遞訊號的方式,它是Qt::ConnectionType列舉型別常量。

有五種型別。

Qt::AutoConnection   當訊號傳送者和接收者處於同一執行緒內時,這個型別等同於DirectConnection,反之等同於QueuedConnection,這個型別也是connect函式的預設連線型別

Qt::DirectConnection  訊號一旦發射,與之關聯的槽函式立即執行

Qt::QueuedConnection  當訊號產生,訊號會暫時被緩衝到一個訊息佇列中,等待接收者的事件迴圈處理去佇列中獲取訊息,然後執行和訊號關聯的槽函式,這種方式既可以在同一執行緒內傳遞訊息也可以跨執行緒操作


Qt::BlockingQueuedConnection  這種型別類似於QueuedConnection,但是它只能應用於跨執行緒操作即傳送者和接收者處於不同的執行緒中的情況,並且訊號傳送者執行緒會阻塞等待接收者的槽函式執行結束

Qt::AutoCompatConnection  當相容Qt3程式是的預設連線型別

二、槽的執行時間大於傳送訊號間隔時間的解決方法

兩種情況

1)如果需要對每個發來的訊號都做出處理,那麼有兩種方式來解決,即在訊號與槽的connect函式中明確第五個引數,將其設定成DirectConnection方式阻塞時程式設計,或者設定成BlockingQueuedConnection按照加鎖佇列都可以很好的解決; 


2)如果只需要對最新的訊號做處理,那麼這裡也給出兩種方案來處理: 
a、槽所線上程設定bool狀態,訊號所線上程通過判定這個bool的狀態來確定是否傳送訊號; 

b、槽執行完畢,則向訊號所線上程傳送返回值,訊號所線上程通過判定發來的這個返回值來判定是否繼續對槽所線上程傳送新的訊號。 

三、希望斷開一段時間的連線後正常連線的辦法

用阻塞或者斷開訊號槽的方法來處理。

1. 阻塞方法:boolQObject::blockSignals(boolblock)

qt描述:阻塞模式下,這個物件傳送的訊號都會被阻塞,解除阻塞後則不再阻塞。返回值為之前狀態的阻塞情況。

2. 斷開訊號槽方法:boolQObject::disconnect

(const*sender, constchar*signal, const*receiver, constchar*method)

qt描述:disconnect將斷開sender和receiver,成功範圍true


四、雜

一個訊號可以和多個槽相連(槽會一個接一個地被呼叫,但是呼叫的順序是不確定的);

多個訊號可以連線一個槽(只要任意一個訊號產生,這個槽就回被呼叫);

槽可以被取消連結:

bool QObject::disconnect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method ) [static]