1. 程式人生 > >多視窗之間使用訊號槽 訊號槽連線方式

多視窗之間使用訊號槽 訊號槽連線方式

今天在 tablewidget中寫了個委託。
想實現 點選委託中的editor(一個button),在主視窗能夠顯示選單。 一開始就想到了訊號槽機制,但是問題在於 button 是 委託中的,沒法直接與主視窗進行connect。

後來發現,是自己訊號槽沒學好,在這裡可以使用自定義的方式。
將button與委託關聯,然後委託與主視窗關聯。

我的實現方式:
在 委託中添加了自定義的訊號以及槽函式:

signals:
    void sendMessage();

public slots:
    void on_Clicked(bool);

然後將button的clicked訊號與槽函式關聯,在槽函式中傳送訊號。

connect(button,SIGNAL(clicked(bool)),this,SLOT(on_Clicked(bool)));
void ComboxDelegate::on_Clicked(bool)
{
    emit sendMessage();
}

最後就是在主視窗中將委託與之關聯:

connect(comboxDelegate,SIGNAL(sendMessage()),this,SLOT(on_Click()));

在引用的部落格連結中時使用的是自動連線命令方式:
void on_<object name>_<signalname>(<signal parameters>)

Constant Value Description
Qt::AutoConnection 0 自動連線:預設的方式。訊號發出的執行緒和糟的物件在一個執行緒的時候相當於:DirectConnection, 如果是在不同執行緒,則相當於QueuedConnection
Qt::DirectConnection 2 直接連線:相當於直接呼叫槽函式,但是當訊號發出的執行緒和槽的物件不再一個執行緒的時候,則槽函式是在發出的訊號中執行的。
Qt::QueuedConnection 3 佇列連線:內部通過postEvent實現的。不是實時呼叫的,槽函式永遠在槽函式物件所在的執行緒中執行。如果訊號引數是引用型別,則會另外複製一份的。執行緒安全的。
Qt::BlockingQueuedConnection 4 阻塞連線:此連線方式只能用於訊號發出的執行緒(一般是先好物件的執行緒) 和 槽函式的物件不再一個執行緒中才能用。通過訊號量+postEvent實現的。不是實時呼叫的,槽函式永遠在槽函式物件所在的執行緒中執行。但是發出訊號後,當前執行緒會阻塞,等待槽函式執行完畢後才繼續執行。
Qt::UniqueConnection 0x80 防止重複連線。如果當前訊號和槽已經連線過了,就不再連線了。

其中UniqueConnection只能算是一個防止重複連線的引數,並不算是一種連線方式;而AutoConnection做為預設的方式,會選擇DirectConnection或者QueuedConnection。