1. 程式人生 > >測試 QT 不同執行緒間signal-slot機制的值傳遞

測試 QT 不同執行緒間signal-slot機制的值傳遞

signal-slot機制是QT的核心,也是QT解決執行緒之間通訊的一大亮點。深刻理解其兩大特性:

(1)loosely coupled

sender 與 receiver 互不關心,一個signal可以被多個slot獲取,signal可以觸發另一個signal

(2)type-safe

connect連線時,遵守嚴格的引數約定,slot引數必須與signal引數保持一致,slot引數數量可以少於signal

現在code看看究竟:

測試方法:

建立兩個dialog視窗:dialog和subdialog,subdialog視窗通過dialog視窗的一個QPushbutton調出。


subdialog視窗上的一個QPushbutton emit 一個訊號:

signal_subdialog(num1, num2);

提前賦值:

void subdialog::slot1()
{
    num1 = 1;
    num2 = 2;
    emit signal_subdialog(num1, num2);
    qDebug("signal emit");
}

主視窗設定一個QLineEdite控制元件來接收顯示從訊號接收的資料。

connect(dialog1, SIGNAL(signal_subdialog(int, int)), this, SLOT(slot_receive(int, int)));


測試順利通過。

總結:

(1)signal 在sender的class裡宣告,沒有定義,宣告時帶上形參,只是形參而已,起到型別宣告的作用。

(2)slot在receiver的class裡宣告並定義,一般為public slots,也要帶上形參,個數不超過signal形參個數。

(3)將sender class 宣告為receiver class的資料成員(一般為private)!

(4)在receiver class的物件中 connect,保持signal和slot的引數型別一致。只寫型別,不帶形參名。

(5)slot定義時形參就是從signal接收來的資料。

void Dialog::slot_receive(int tmp1, int tmp2)
{
    shownumber1 = tmp1;
    shownumber2 = tmp2;
   qDebug()<<shownumber1<<shownumber2;
   line->setText(QString("receive number is %1 and %2").arg(shownumber1).arg(shownumber2));
}