一隻菜鳥的Qt學習路程
阿新 • • 發佈:2019-01-02
大家好,我是一名即將畢業的軟體工程大四學生,以前從未接觸過Qt,但是研究生導師給我的畢業設計讓我使用Qt,所以我從今天開始了Qt的學習路程。
扶額,想刪除已經上傳的圖片,按到了退格鍵,剛才寫的那麼一大段都沒了……
程式猿的習慣,遇到新東西先HelloWorld一下,於是我就開始著手製作一個帶選單響應的HelloWorld小程式。我用的是Qt5.4和VS2010。需要注意的是專案路徑中不能有中文。新建好專案之後通過Qt設計器編輯了Ui就可以直接執行出HelloWorld了。
不過我還不滿足,就添加了一個選單。效果如下圖。
然後問題就來了,我在設計器裡面找了半天都沒找到該如何給這個按鈕新增響應,翻書查百度之後瞭解到Qt的事件響應機制是通過訊號和槽來實現的。那就好辦了,照著書上來寫吧,就像下面的程式碼一樣。
#include <QtWidgets/QMainWindow> #include "ui_qthelloworld.h" class QtHelloWorld : public QMainWindow { Q_OBJECT public: QtHelloWorld(QWidget *parent = 0); ~QtHelloWorld(); private: Ui::QtHelloWorldClass ui; <span style="color:#3333ff;">signals: void ExitPressed();</span> private slots: void ExitPro(); }; #endif // QTHELLOWORLD_H
上面就是QtHelloWorld視窗類的類定義。裡面還有個訊號叫做ExitPressed(),通過看書也知道了訊號不需要具體實現,也就是說那個函式是不用實現的。
然後在建構函式裡面把訊息傳送者和接受者以及訊息和槽函式(響應函式)連結(connect)起來。程式碼就像是下面的一樣。
滿心歡喜的編譯執行,沒報錯誤,窗體出現了,點選Exit,沒反應。這是為什麼呢?糾結了一中午之後終於想明白了,期間嘗試各種除錯ExitPressed和ExitPro函式,發現槽函式始終進不去,然後在建構函式裡面插入一個斷點後發現,執行完connect函式之後會輸出三句話,第一句是No such QAction::ExitPressed(),可是我明明有啊!百度之,翻書之,看例子之,明白了。QtHelloWorld::QtHelloWorld(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); this->addAction(ui.actionExit_2); connect(ui.actionExit_2,SIGNAL(ExitPressed()),this,SLOT(ExitPro())); }
所謂訊息,就是Sender(訊息傳送者)發出的訊息,是要Sender具有的Signal,我把ExitPressed寫在QtHelloWorld裡面當然在傳送者裡找不到了,不過我用的訊息傳送者是系統提供的選單元件,它自己有提供訊息,那就是triggered(),所以正確的connect函式應該是這樣的。
connect(ui.actionExit_2,SIGNAL(triggered()),this,SLOT(ExitPro()));
這樣編譯後就執行成功了。