[教學]step by step用Qt Creator寫視窗程式

再把一些PO一PO就要先暫停自由研究了...

Ubuntu 9.10似乎是今天出阿...9.04的WIKI都還沒翻譯完的說= =
沒有像上次那樣有人號召,靠一個人的力量果然有限...

廢話就到此為止了...開始教學吧
希望能幫助一些想入門跨平台程式開發的人能有個方向

文章內容有
1.使用Qt Creator建立視窗
2.QThread入門
3.建立/處理元件發出的訊號

1.建立QT GUI程式

選擇Qt4 Gui Application後按OK
 

輸入ProjectName
 

選擇要用的模組(本教學不需要額外模組)

如果在上一張圖的時候沒選到模組想新增的話
可以加上QT += 模組名稱

2.設計界面
點選UI檔後
把左邊的LABEL拖進去
並在LABEL屬性中改變字形大小為24

修改objectName(之後呼叫時要用的)
基本上就是變數名稱

修改LABEL文字
可以在屬性視窗修改
或是在LABEL上點兩下修改

加入另一個LABEL-"Thread Ready"並用LAYOUT稍微整理

新增一個Resource file

在qrc中新增Prefix

接著新增檔案

加入icon後在File選單按save all

照LABEL的方式加入pushButton
並在右下角的ICON屬性中點選"..."按鈕選擇圖示
如果沒出來就一下綠色的重整鈕

加入後的樣子

修改按鈕大小為48*48

完成介面

3.加入按鈕訊號
先切換成訊號編輯模式(按圖中按鈕或鍵盤F4)

壓住按鈕元件並拖曳至mainwindow中
使兩個元件建立連線
會出現如下畫面
按edit鈕新增slot

按右邊視窗中的edit鈕後繪出線左邊的slots編輯視窗
按綠色"+"號
加入
threadStart()
threadPause()
threadStop()
三個slot

選擇剛剛加入的slot

會如下的結果

4.新增charThread class
header和source file

撰寫header(完整程式在最下面)

撰寫source(完整程式在最下面)

5.修改mainwindow
在header檔中增加紅框內容

在source檔中增加紅框內容
ct = new charThread(ui->label_change);
必須放在ui->setupUi(this);後面
必需讓ui->label_change先產生
下面則是實作slot內容

6.測試
到此就完成了
按左下角的綠色箭頭就可以開始編譯並執行了

執行畫面

Thread start

停止畫面

charThread.h
--------------------------------------------------------------------------------
#ifndef CHARTHREAD_H
#define CHARTHREAD_H

#include <QThread>
#include <QLabel>

class charThread : public QThread
{
    private:
        QLabel *label;
        char ch;
        //暫停旗標和停止旗標
        bool isPause, isStop;

    public:
        charThread(QLabel *);
        void run();
        void setPause();
        void setStop();

};

#endif // CHARTHREAD_H

charThread.cpp
----------------------------------------------------------------------------------
#include "charThread.h"

charThread::charThread(QLabel *label)
{
    this->ch = 'A';
    this->isPause = false;
    this->isStop = false;
    this->label = label;
}

void charThread::run()
{
    while(!isStop)
    {
        label->setText(&ch);
        ch++;
        QThread::msleep(100);
       
        //暫停動作
        while(isPause)
        {
            QThread::msleep(100);
        }
    }
    this->label->setText("Thread stop");
}

void charThread::setStop()
{
    this->isStop = true;
}

void charThread::setPause()
{
    //利用XOR運算
    this->isPause = this->isPause ^ true;
}

其他:
原本也是用Ccode::Block來寫QT
不過後來用QT Creator後發現他和我平時寫JAVA GUI程式的模式差不多
都是把GUI整個抽出來當一個CLASS(MVC)架構
算是Qt Designer的進化版

關於Q_OBJECT
在MainWindow中出現是為了要處理訊號
也就是說MainWindow其實是Controller

Thread的暫停和停止用flag主要是受到JAVA的影響
在JAVA中stop()是用例外的方式終止Thread
所以Thread控制都是自己來