1. 程式人生 > >QT學習筆記2(應用程式設計基礎)

QT學習筆記2(應用程式設計基礎)

一、UI檔案設計與執行機制

1、專案管理檔案(.pro)

專案的管理檔案以 .pro結尾,開啟之後

#-------------------------------------------------
#
# Project created by QtCreator 2018-11-10T15:26:48
#
#-------------------------------------------------

QT       += core gui    //表示專案中加入core gui模組 ,core gui是qt用於GUI設計的類庫檔案

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //加入widgets模組

TARGET = test1  //生成的目標可執行檔案的名稱 ,即編譯生成的可執行檔案是 test1.exe
TEMPLATE = app  //專案使用的模板是app,是一般的應用程式

//以下三個記錄了專案中包含的源程式檔案、標頭檔案和窗體檔案的名稱
SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

2、介面檔案(.ui)

屬性編輯器

訊號與槽的簡單使用:

實現點選一個按鈕後,實現視窗關閉的功能。

編譯執行之後即可實現點選按鈕,關閉視窗的功能。

3、主函式檔案(main.cpp)

main()函式是應用程式的入口。主要功能是建立應用程式,建立視窗,顯示視窗,並執行應用程式,開始應用程式的訊息迴圈和事件處理。

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);//定義並建立應用程式
    MainWindow w;//定義並建立視窗
    w.show();//顯示視窗

    return a.exec();//應用程式執行
}

4、窗體相關檔案

我用的qt5.6.1與書上講的qt5.9略有不同。

(1)mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {  //名稱空間ui,包含一個類 MainWindow,用於描述介面元件
class MainWindow;
}

class MainWindow : public QMainWindow  //MainWindow類的定義
{
    Q_OBJECT //巨集Q_OBJECT,這裡是qt的訊號與槽機制的類都必須加入的一個巨集

public:  //定義了MainWindow類的建構函式和解構函式
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:   //定義了一個指標,指標ui指向視覺化設計的介面,要訪問的元件都是通過這個指標ui
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

(2)mainwindow.cpp  檔案

mainwindow.cpp檔案是類mainwindow的實現程式碼。

#include "mainwindow.h"
#include "ui_mainwindow.h"//Qt編譯生成的與ui檔案對應的類定義檔案
//建構函式頭部   執行父類QWidget的建構函式
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow) //建立一個Ui::MainWindow類的物件ui,ui就是MainWindow的部分定義的指標變數ui
{
    ui->setupUi(this);//執行Ui::MainWindow類的setupUi()函式,實現視窗的生成和各種屬性的設定、訊號與槽的關聯
}

MainWindow::~MainWindow()
{
    delete ui;//解構函式,刪除用new建立的指標ui
}

(3)mainwindow.ui檔案

是一個XML檔案,定義了視窗上所有元件的屬性設定、佈局,及其訊號與槽函式的關聯等。

二、視覺化UI設計

1、工具欄各按鈕功能

使用工具欄上的佈局控制按鈕時,只需要在窗體上選中需要設計佈局的元件,然後點選某個佈局按鈕即可。

2、訊號與槽

訊號:就是特定情況下被髮射的事件,例如PushButton元件的滑鼠點選 clicked()訊號。GUI程式設計的主要內容就是對各個元件的訊號的響應,只需要知道在什麼情況下發射哪些訊號,合理的響應這些訊號。

槽:就是對訊號的響應函式。槽函式與一般函式不同,槽函式可以關聯訊號,當訊號發射時,關聯的槽函式被自動執行。

訊號與槽關聯的使用QObject::connect()函式實現的,其基本格式是:

QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));

各部分詳解:

QObject是所有Qt類的基類;

connect()是QObject類的一個靜態函式;

sender是發射訊號的物件名稱;

signal()是訊號名稱,有引數還要指明引數;

receiver是接收物件名稱;

slot()是槽函式名稱,有引數還要指明引數;

SIGNAL和SLOT是qt的巨集,用於指明訊號和槽,並將它們的引數轉化為相應的字串。

舉例:

     QObject::connect(btnClose,SIGNAL(clicked()),Widget,SLOT(close()));

作用就是將btnClose按鈕的clicked()訊號與窗體Widget的槽函式close()相關關聯

訊號和槽的使用規則:

 (1)一個訊號可以連線多個槽

(2)多個訊號可以連線同一個槽

(3)一個訊號可以連線另外一個訊號

3、視覺化生成槽函式

選擇一個框架

可以選擇轉到槽,自動生成一個槽函式

三、程式碼化UI設計

建立工程檔案時不勾選建立介面

寫到這裡發現自己用的qt版本低打不開書中的qt原始碼,所以要裝個qt5.9,順便送個小彩蛋

1、QWDlgManual類定義

#ifndef QWDLGMANUAL_H
#define QWDLGMANUAL_H

#include <QDialog>

#include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton>


class QWDlgManual : public QDialog
{
    Q_OBJECT

private:  //聲明瞭介面的各個元件的指標變數,介面元件都需要在QWDlgManual類的建構函式裡建立並在窗體上佈局
    QCheckBox   *chkBoxUnder;
    QCheckBox   *chkBoxItalic;
    QCheckBox   *chkBoxBold;

    QRadioButton    *rBtnBlack;
    QRadioButton    *rBtnRed;
    QRadioButton    *rBtnBlue;

    QPlainTextEdit  *txtEdit;

    QPushButton     *btnOK;
    QPushButton     *btnCancel;
    QPushButton     *btnClose;

    void    iniUI();//UI 建立與初始化  
    void    iniSignalSlots();//初始化訊號與槽的連結

private slots:
    void on_chkBoxUnder(bool checked); //Underline 的clicked(bool)訊號的槽函式

    void on_chkBoxItalic(bool checked);//Italic 的clicked(bool)訊號的槽函式

    void on_chkBoxBold(bool checked); //Bold 的clicked(bool)訊號的槽函式

    void setTextFontColor(); //設定字型顏色

public:
    QWDlgManual(QWidget *parent = 0);
    ~QWDlgManual();

};

#endif // QWDLGMANUAL_H

2、介面元件的創建於佈局

(1)iniUI()實現介面元件的建立與佈局

void QWDlgManual::iniUI()
{
//建立 Underline, Italic, Bold三個CheckBox,並水平佈局
    chkBoxUnder=new QCheckBox(tr("Underline"));
    chkBoxItalic=new QCheckBox(tr("Italic"));
    chkBoxBold=new QCheckBox(tr("Bold"));

    QHBoxLayout *HLay1=new QHBoxLayout;
    HLay1->addWidget(chkBoxUnder);
    HLay1->addWidget(chkBoxItalic);
    
    HLay1->addWidget(chkBoxBold);

//建立 Black, Red, Blue三個RadioButton,並水平佈局
    rBtnBlack=new QRadioButton(tr("Black"));
    rBtnBlack->setChecked(true);//預設被選中
    rBtnRed=new QRadioButton(tr("Red"));
    rBtnBlue=new QRadioButton(tr("Blue"));

    QHBoxLayout *HLay2=new QHBoxLayout;
    HLay2->addWidget(rBtnBlack);
    HLay2->addWidget(rBtnRed);
    HLay2->addWidget(rBtnBlue);

//建立 確定, 取消, 退出 三個 QPushButton, 並水平佈局
    btnOK=new QPushButton(tr("確定"));
    btnCancel=new QPushButton(tr("取消"));
    btnClose=new QPushButton(tr("退出"));

    QHBoxLayout *HLay3=new QHBoxLayout;
    HLay3->addStretch();
    HLay3->addWidget(btnOK);
    HLay3->addWidget(btnCancel);
    HLay3->addStretch();
    HLay3->addWidget(btnClose);


//建立 文字框,並設定初始字型
    txtEdit=new QPlainTextEdit;
    txtEdit->setPlainText("Hello world\n\nIt is my demo");

    QFont   font=txtEdit->font(); //獲取字型
    font.setPointSize(20);//修改字型大小為20
    txtEdit->setFont(font);//設定字型

//建立 垂直佈局,並設定為主佈局
    QVBoxLayout *VLay=new QVBoxLayout;
    VLay->addLayout(HLay1); //新增字型型別組
    VLay->addLayout(HLay2);//新增字型顏色組
    VLay->addWidget(txtEdit);//新增PlainTextEdit
    VLay->addLayout(HLay3);//新增按鍵組

    setLayout(VLay); //設定為窗體的主佈局
}

(2)訊號與槽的關聯

void QWDlgManual::iniSignalSlots()
{
//三個顏色  QRadioButton的clicked()事件與setTextFontColor()槽函式關聯
    connect(rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
    connect(rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//
    connect(rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));//

//三個字型設定的  QCheckBox 的clicked(bool)事件與 相應的槽函式關聯
    connect(chkBoxUnder,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxUnder(bool)));//
    connect(chkBoxItalic,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxItalic(bool)));//
    connect(chkBoxBold,SIGNAL(clicked(bool)),this,SLOT(on_chkBoxBold(bool)));//

//三個按鍵與窗體的槽函式關聯
    connect(btnOK,SIGNAL(clicked()),this,SLOT(accept()));//
    connect(btnCancel,SIGNAL(clicked()),this,SLOT(reject()));//
    connect(btnClose,SIGNAL(clicked()),this,SLOT(close()));//
}

測試效果