1. 程式人生 > >一隻菜鳥的Qt學習路程

一隻菜鳥的Qt學習路程

    大家好,我是一名即將畢業的軟體工程大四學生,以前從未接觸過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)起來。程式碼就像是下面的一樣。

QtHelloWorld::QtHelloWorld(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	this->addAction(ui.actionExit_2);
	connect(ui.actionExit_2,SIGNAL(ExitPressed()),this,SLOT(ExitPro()));
}
    滿心歡喜的編譯執行,沒報錯誤,窗體出現了,點選Exit,沒反應。這是為什麼呢?糾結了一中午之後終於想明白了,期間嘗試各種除錯ExitPressed和ExitPro函式,發現槽函式始終進不去,然後在建構函式裡面插入一個斷點後發現,執行完connect函式之後會輸出三句話,第一句是No such QAction::ExitPressed(),可是我明明有啊!百度之,翻書之,看例子之,明白了。

    所謂訊息,就是Sender(訊息傳送者)發出的訊息,是要Sender具有的Signal,我把ExitPressed寫在QtHelloWorld裡面當然在傳送者裡找不到了,不過我用的訊息傳送者是系統提供的選單元件,它自己有提供訊息,那就是triggered(),所以正確的connect函式應該是這樣的。

connect(ui.actionExit_2,SIGNAL(triggered()),this,SLOT(ExitPro()));
    這樣編譯後就執行成功了。