Qt開發系列2——使用Qt開發一個簡單程序 一、手工代碼編寫QT程序 二、使用Qt Designer進行程序界面設計 三、使用QCreator開發Qt程序 待整理

這裏介紹開發Qt程序的一些方法和步驟。
主要內容:
一、手工編寫QT程序
二、使用Qt Designer進行程序界面設計
三、使用QCreator開發Qt程序

一、手工代碼編寫QT程序

1.程序功能

只有一個窗口的helloworld程序。

2.代碼如下

//main.cpp
#include
#include
int main( int argc, char **argv )
{
QApplication a( argc, argv );


QWidget window;
window.resize(320, 240);
window.show();

return a.exec();
}

3.編譯與運行

編譯過程:

$qmake -project
$qmake
$make

運行:

$./main

假設生成的文件名稱是main,這樣運行會彈出一個簡單的窗口,大小320x240。另外在X窗口運行的時候也可嘗試用-geometry 100x200+10+20來指定大小。

二、使用Qt Designer進行程序界面設計

使用Qt Designer可以快速對程序界面進行設計。使用Qt Designer設計程序界面,有四種方式:

第1種方法:就是在源代碼中直接利用designer生成的頭文件

步驟如下:

a,首先利用designer設計界面,之後保存。

這裏保存的文件爲untitled.ui,xml格式。

b,在untitled.ui所在目錄中隨便寫一個main.cpp文件裏面有運行程序的main函數

(main可以先空白着)

c,運行如下命令生成ui頭文件。

$qmake -project
$qmake
$make

這裏,make之後可能會報錯(由於main.cpp中的錯誤),不用管,這裏目的只是先生成一個根據untitled.ui的頭文件ui_untitled.h.

d,將ui界面添加到源代碼中,改寫main.cpp,如下:

#include
#include "ui_untitled.h"
int main(int argc, char *argv[])
{
  QApplication app(argc, argv);

  //這個window定義類型和ui_untitled.h中的setupUi參數類型一樣
  QMainWindow *window = new QMainWindow;

  //這裏是在程序中使用自己ui的方法,ui就是頭文件定義的類對象
  //聲明是Ui_MainWindow但是可以這樣引用
  Ui::MainWindow ui;
  ui.setupUi(window);

  window->show();
  return app.exec();
}

e,編譯運行:

$make
$<運行>

第2種方法:利用designer生成的類包含到自己的類中

和第一種方法不同的是,此方法不是直接使用designer生成的類,而是定義一個自己的類,類中包含designer生成類的對象(因爲生成的類不繼承任何所以可能不是Qobject的子類)來集中管理用戶控件,自己定義的類可以繼承其他QObject類,進而可以定義自己的槽和信號了。這也是後面QCreator使用Qt Designer的方式。編譯和運行過程和前面類似。

第3種方法:使用多繼承,繼承Qt Designer生成的類

方法和第2種類似,不同的是方法2使用的是單繼承一個自己喜歡的類然後在自己的類中將designer生成的類做爲一個對象成員;這裏卻是多繼承實現的:一個父類是自己喜歡繼承的類,一個父類是designer生成的類。

第4種方法:運行時動態加載界面文件,不用生成界面文件的代碼

這裏和前面的方法都不一樣,這裏使用的untitled.ui文件不用生成ui_untitled.h而是動態讀取。即,程序運行的時候,動態地讀取untitled.ui的內容生成程序界面。這樣,修改ui的時候非常方便,不用再重新編譯了,只需要修改untitled.ui就行。
過程如下:

1)使用designer設計保存文件爲untitled.ui

2)建立main.cpp文件內容如下:

#include
#include


//這個文件必須包含用於動態加載ui.
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);


//加載ui文件
QUiLoader loader;
QFile file("./untitled.ui");
file.open(QFile::ReadOnly);


//根據ui文件生成界面
QWidget *uiWidget = loader.load(&file, 0);
file.close();
uiWidget->show();


//根據名稱獲得子部件的示例代碼
//ui_Button = qFindChild(this,"name1");
//ui_textEdit = qFindChild(this, "name2");
//ui_lineEdit = qFindChild(this, "name3");


return app.exec();
}

3)生成.pro文件:

$qmake -pro

文件內容如下:

###############################
TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

#Input
FORMS += untitled.ui
SOURCES += main.cpp

#這裏是手動加的
#make時不自動生成頭文件
FORMS -= untitled.ui
#使用動態加載必須這樣配置
CONFIG += uitools
###############################

4)編譯運行:

$qmake
$make
$./<運行程序>

三、使用QCreator開發Qt程序

QCreator是Qt的集成開發環境,利用它可以大大提高開發的效率。這裏用一個完整的例子來說明使用過程。

軟件版本:Qt Creator 2.4.1

安裝qcreator

$sudo apt-get install qtcreator

這裏,安裝的版本是Qt Creator 2.4.1。

設置編譯工具

參見:工具->選項->構建和運行,重點關注"Qt版本"和"工具鏈"兩項。

編譯和運行不同的版本

新建項目後,在左側欄中選擇"項目",其中,“構建設置”可設置編譯成哪個版本(arm/x86/x11),“運行設置”可設置運行的參數等。

  • 對於qte的arm程序,只能編譯,不能運行。
  • 對於qte的x86程序,編譯後能在qvfb中運行。
  • 對於qtx11的程序,編譯後,可以直接運行。

建立外部工具

這裏假設建立"qvfb"模擬器,啓動模擬器後可以運行qte-x86的程序。

  1. 建立方法:工具->外部->配置->外部工具->添加,然後填入啓動qvfb所需的參數(這裏假設添加的名字爲qvfb)。
  2. 啓動方法:工具->外部->qvfb。

其實,也可自己在終端手動啓動qvfb,而不用添加外部工具。

編寫程序

使用QtCreator創建的項目,會自動生成許多相關的文件,相比手工建立這些文件要方便,創建新項目之後,即可進行程序的創建。

下面給出一個例子:

(1)初始創建

  1. 文件->新建文件或工程
  2. 選擇:Qt 控件項目->Qt Gui應用->下一步
  3. 設置好“名稱”(mysinglegui)和“創建路徑”->下一步
  4. 設置好編譯版本(x86/arm/x11編譯 debug/release版本)->下一步
  5. 採用默認的主窗口類名,ui界面文件名等設置->下一步->完成

至此,生成一個空白的gui程序,只有一個窗口。

(2)文件分析

項目目錄的文件系統下主要包含的文件:

mainwindow.ui
main.cpp
mainwindow.h
mainwindow.cpp
ui_mainwindow.h(編譯時根據mainwindow.ui生成)

大致介紹如下:

(a)mainwindow.ui

此文件爲描述主窗口的界面文件,內容不用解釋,該文件打開之後,可以通過集成進QCreator的Qt Designer用可視化方式對主窗口中的子元素進行佈局和設置。編譯程序時,會根據該文件自動生成一個普通類(注意它不是QObject的子類,只是普通類),它僅包含主窗口外的子元素集合,該類的類名和主窗口類名一樣但是在"Ui::"命名空間聲明,該類的作用是集中管理主窗口的子部件,見後對其文件的描述。

(b)main.cpp:

#include
#include "mainwindow.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();


    return a.exec();
}

由此可知,此文件爲程序的主入口文件,會創建MainWindow類窗口,並將其顯示。

(c)mainwindow.h

#include
namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT


    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();


    private:
        Ui::MainWindow *ui;
};

由此可見,此文件是程序主窗口的類聲明,注意主窗口的界面元素和佈局等其實都在其ui成員中設置,ui成員就是前面說的集中管理子界面的普通類對象。我們可在MainWindow類中定義自己的槽和信號。

(d)mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}


MainWindow::~MainWindow()
{
    delete ui;
}

此爲主窗口類的實現,注意ui->setupUi(this);會將我們設置好的主窗口界面子元素設置並佈局好。

(e)mysinglegui.pro

此爲整個項目的配置文件,根據用戶在QCreator中的操作和設置自動生成,一般不會手動修改。

(f)ui_mainwindow.h

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
    public:
        QMenuBar *menuBar;
        QToolBar *mainToolBar;
        QWidget *centralWidget;
        QStatusBar *statusBar;


        void setupUi(QMainWindow *MainWindow)
        {
            if (MainWindow->objectName().isEmpty())
                MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
            MainWindow->resize(400, 300);
            menuBar = new QMenuBar(MainWindow);
            menuBar->setObjectName(QString::fromUtf8("menuBar"));
            MainWindow->setMenuBar(menuBar);
            mainToolBar = new QToolBar(MainWindow);
            mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
            MainWindow->addToolBar(mainToolBar);
            centralWidget = new QWidget(MainWindow);
            centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
            MainWindow->setCentralWidget(centralWidget);
            statusBar = new QStatusBar(MainWindow);
            statusBar->setObjectName(QString::fromUtf8("statusBar"));
            MainWindow->setStatusBar(statusBar);


            retranslateUi(MainWindow);


            QMetaObject::connectSlotsByName(MainWindow);
        } // setupUi


        void retranslateUi(QMainWindow *MainWindow)
        {
            MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
            Q_UNUSED(MainWindow);
        } // retranslateUi


};


namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui


QT_END_NAMESPACE

這個文件是編譯時根據mainwindow.ui自動生成的。前面對其進行了相關的描述。需要注意的是,在setupUi中最後的connectSlotsByName函數,它所做的是自動連接信號到MainWindow的指定槽上,具體參見後面。

(3)添加代碼

(a)ui的作用

實際添加代碼和不用QCreator開發類似,QCreator所做的只是將窗口的子部件全部放置一個普通類對象"ui"中集中管理。對於其它代碼的添加(例如信號和槽等實現),不用修改那個自動生成的ui類,只需修改MainWindow類的相應部分即可。

(b)信號和槽

我們可以像一般QT程序那樣連接信號和槽,但是如果想使ui對象的connectSlotsByName函數自動連接起作用,這要求MainWindow主窗口類中定義的槽的命名爲on__,即例如想將對象名爲btn的子構件的clicked信號連接,那麼MainWindow中的槽名字應爲:on_btn_clicked。這裏的對象名不是代碼中的變量名,而是QObject的objectname,是Qt控件的一個標識屬性。

(c)多窗口

另外,對於多窗口程序,我們可以繼續在已有項目基礎上繼續創建剩餘窗口。通過在當前項目名下,右鍵->添加新文件,可以只添加.cpp .h 以及.ui文件,或者將三種文件自動一併添加,並在代碼級別上使它們和主程序有所關聯。但是不要在創建時ui設計器中把主窗口的對象名改變,否則其自動生成的Ui::classname變成對象名,導致無法編譯通過。

(4)運行和部署

左側"項目"->"運行設置"

這裏可以設置運行的參數,以及部署的位置和命令。

待整理

具體編寫代碼規則等,需參見“幫助”中的文檔信息。

添加槽的簡單方法:在Qt Designer界面右擊相應控件->轉到槽->選擇觸發槽的相應信號。

問題:代碼中頭文件的包含信息丟失?

2013-11-20 17:39:10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章