測試 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));
}