1. 程式人生 > >Qt深入淺出(一) 從零開始寫Qt應用

Qt深入淺出(一) 從零開始寫Qt應用

1 Qt簡單介紹

1.1 什麼是Qt

​ Qt是1991年由奇趣科技開發的跨平臺C++圖形使用者介面應用程式開發框架。它既可以開發GUI(Graphical User Interface)程式,也可用於開發非GUI程式,比如控制檯程式。與windows上面的MFC是同一類東西。它提供給應用程式開發者建立藝術級的圖形使用者介面所需的所有功能,並且Qt很容易擴充套件。

​ Qt Creator是一個用於Qt開發的輕量級跨平臺整合開發環境。Qt Creator可帶來兩大關鍵益處:提供首個專為支援跨平臺開發而設計的IDE(integrated development environment),並確保首次接觸Qt框架的開發人員能迅速上手和操作。即使不開發Qt應用程式,Qt Creator也是一個簡單易用且功能強大的IDE。

​ Qt真正指的是Qt庫,並不是Qt Creator,官網上面的Qt版本號5.7.0也是指的是Qt庫的版本,開發者也可以使用VS整合開發環境來開發基於Qt的應用程式。

1.2 優良的跨平臺特性

​ Qt支援下列作業系統: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。

​ Qt在各個平臺上都封裝了同一套對外的程式設計介面API(Application Program Interface),開發者可以在一個平臺上編寫Qt程式, 同時可以將不經過任何修改的程式碼放到其它平臺中編譯, 可以生成對應平臺的應用程式.

  簡單來說,就是一份程式碼到處編譯。

1.3 第一個Qt GUI應用

​ 使用Qt Creator整合開發環境開發應用是通過qmake來組建專案,qmake與cmake類似,qmake語法更簡單,cmake功能更強大。

​ qmake能夠自動生成Makefile、Microsoft Visual Studio 專案檔案。不管原始碼是否是用Qt寫的,都能使用qmake,因此qmake能用於很多軟體的構建過程,qmake檔案的字尾一般為.pro。

  1. 新建qmake空專案,新增main.cpp原始檔


  2. 編寫.pro專案工程qmake檔案,加上QT變數

    ​  

  3. main.cpp中新增QApplication標頭檔案,並且例項化

    #include <QApplication>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv); //每個Qt應用只能有一個QApplication物件,QApplication物件主要用來處理主程式控制流和主要設定。
    }

  4. 新增QWidget標頭檔案,例項化物件,呼叫QWidget物件的show函式顯示

    #include <QApplication>
    #include <QWidget>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        QWidget widget; //Qt中每個視窗都是QWidget物件,或者其派生類的物件。
        widget.show();
    }

  5. 呼叫QApplication::exec()訊息迴圈, 接受來自桌面系統的訊息

    #include <QApplication>
    #include <QWidget>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        QWidget widget;
        widget.show();
        return app.exec(); //訊息迴圈,訊息泵,阻塞接收桌面系統傳遞過來的訊息。
    }
  6. 設定視窗標題

    #include <QApplication>
    #include <QWidget>
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        QWidget widget;
        widget.setWindowTitle("helloworld");
        widget.show();
        return app.exec();
    }

重要知識:

  1、Qt中大部分的類都是繼承至QObject,QObject是最基本的類, 通過幫助文件可檢視繼承關係。

  2、QApplication用來管理介面應用的控制流以及主要的程式設定。在Qt中不管有多少的視窗,QApplication例項物件都只有一個。

​ 3、QWidget 在Qt中是所有視窗類的基類。

2 認識視窗

2.1 視窗大小

​ Qt中每一個視窗都可以設定其視窗大小,以畫素為單位。

void QWidget::resize(int w, int h) //設定視窗大小
QSize size() const   //獲取視窗大小,返回的是QSize,QSize封裝了寬高

2.2 視窗座標系

​ Qt中每一個視窗都有一個座標系統,預設的,視窗左上角為座標原點,水平向右遞增,水平向左遞減,垂直向下遞增,垂直向上遞減。原點即為(0,0)點,以畫素為單位增減。

​ 如圖:

2.3 視窗關係

​ 普通視窗可以以頂級視窗方式顯示,比如直接呼叫show函式來顯示;也可以巢狀在其它視窗上來顯示,這個時候被巢狀的視窗叫做父視窗,巢狀的視窗叫做子視窗。(注意:父子視窗是物件間的組合關係,不是父子類繼承關係)

​ 子視窗位置座標參考的是父視窗的座標系。

​ 頂級視窗其父視窗就是桌面,桌面也可以認為是一個視窗。

  • 設定父視窗

void QWidget::setParent(QWidget *parent)

例如:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget widget;
    QPushButton pb;
    pb.setParent(&widget);  //注意將按鈕巢狀到widget視窗中的時候,必須在widget物件呼叫show函式之前,否則pb視窗不顯示。
    widget.show();
    return app.exec();
}
  • 設定視窗位置座標

void QWidget::move(int w, int h)   //設定視窗位置,單位畫素
void QWidget::setGeometry(int x, int y, int w, int h) //設定視窗幾何屬性,座標與大小,單位畫素
QPoint pos() const     //獲取視窗位置,返回QPoint類物件,QPoint封裝了x、y座標

注意:視窗移動的作用點是該視窗的座標原點,也就是視窗的左上角。

2.4 使用訊號

​ 訊號和槽用於兩個QObject物件或者其派生類之間的通訊,訊號和槽機制是Qt的核心特徵,也是Qt不同於其它開發框架的最突出的特徵。

​ 例如:QPushButton物件點選之後會發射出一個clicked()訊號,我們現在要把這個訊號傳遞給QWidget物件,並且讓QWidget物件呼叫close()函式關閉視窗。

  • 那麼要使用到QObject的一個靜態函式connect:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection);

/*將sender物件的訊號signal連結到receiver物件的槽函式method,並且返回一個QMetaObject::Connection物件,可以使用該物件呼叫disconnect函式來登出連結。
type一般選用預設引數即可。
*/

​ 原始碼:

#include <QApplication>
#include <QWidget> 
#include <QPushButton>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget widget;  
    QPushButton pb;
    pb.setParent(&widget);
    QObject::connect(&pb, SIGNAL(clicked()), &widget, SLOT(close()));
    widget.show();
    return app.exec();
}
  • 訊號作為connect的傳入引數時候需要使用SIGNAL()這個巨集函式來包裝一下

  • 槽函式作為connect的傳入引數時候需要使用SLOT()這個巨集函式來包裝一下

初步認識就到這裡,後面會再詳細介紹Qt中的訊號槽機制。