1. 程式人生 > >QT學習之路---訊號與槽問題解析

QT學習之路---訊號與槽問題解析

前兩天用到了QT的訊號與槽這個機制,剛開始發射訊號的時候,我是這麼寫的語句

connect(sender,SINGAL(),receiver,SLOT())

由於我用的是QT 5.11這個本,從網上查到的例子來說,大部分都是以上那個形式,也沒有問題,而實際上在QT5.11版本上,向下面這樣寫編譯器不會報錯

    connect(Polar_chartView,SIGNAL(Polar_Close_Singal),this,SLOT(Recrive_Signal_From_ChidrenDialog));

 但是在debug時應用程式輸出這樣的提示

QObject::connect: Parentheses expected, signal Polar::Polar_Close_Singal in
..\JCY\mainwindow.cpp:9

QObject::connect: (receiver name: 'MainWindow')

應該更直白的說,語法錯了。。。。

因為在QT5.11中,語法格式應為

    connect(Polar_chartView,&Polar::Polar_Close_Singal,this,&MainWindow::Recrive_Signal_From_ChidrenDialog);

這裡得吐槽一下,QT這個自動提示功能,慢的很,倒逼我去背語法啊!!!

這裡連線函式用正確的語法寫好之後,只能說這個橋搭好了,能不能讓資料按照我們的意願過橋,也是一個對於初學者不是很友好的問題,

  1. 發射訊號裡含有資料格式數量(send_format_num)一定是大於等於接收訊號裡含有的資料格式的數量(receive_format_num),就是我可以多發,你可以選擇性的接收,但是所有想要接收的一定要都發出來,不然會報錯;

  2. 一定要在標頭檔案裡宣告相應的函式,這個網上有很多就不多說了;

  3. 發射訊號的語法都是一樣的,都是用emit這個關鍵字

  4. emit Polar_Close_Singal(QString);

     

    接收訊號其實是一個void型別的函式

    void MainWindow::Recrive_Signal_From_ChidrenDialog(QString temp)
    {
    qDebug()<<temp;
    
    }
    

     

  5. 我在使用訊號與槽機制時遇到的一點小問題,就是connect函式裡,sender這個傳送者名稱這裡遇到的,首先我是從Polar這個C++類向MainWindow這個QT視窗類類裡傳送資料,我就需要在MainWindow裡宣告一個Polar類的變數名,這個變數名一定要唯一,否則connect函式也不會報錯,但就是不會把資料傳送過來。

    PortDialog *portdialog=new PortDialog();
    

    後續遇到問題會逐漸更新。