使用QT速成C++簡單圖形界面

背景

這幾天遇到一個問題,需要在2、3天之內給一個已經編寫好的簡單C++命令行程序編寫一個簡單的圖形界面。

由於之前沒有接觸過圖形界面編程,所以不知道能不能搞定。後來詢問了一些羣友,在羣友的推薦下,使用了QT這個框架(他們說MFC的API的設計不太好)。記錄一下兩三天速成圖形界面的過程,希望能給一些想速成圖形界面的讀者帶來幫助。

由於是速成的,而且只花了兩三天,所以這篇博客不會包含原理類的東西,比如槽和信號的原理(想要了解原理的請自行學習),而且只使用了簡單的控件,比如按鈕、文本框等。

QT的安裝不做簡介,使用的QT的是QT 5.14.1,Community中文版。

過程

新建項目

打開QT Creator,點擊左上角的文件->新建文件或項目,在彈出的窗口中選擇Qt Widgets Application

在這裏插入圖片描述

在設置Details時,Bass class選擇QMainWindow,並且一定要勾選Generate form。其它隨意(我這裏全面使用默認值)。項目保存的路徑裏不要有中文

在這裏插入圖片描述

成功創建項目後,大概是這樣:

在這裏插入圖片描述

需要用到的是:mainwindows.h(編寫代碼)、mainwindows.cpp(編寫代碼)和mainwindows.ui(做界面)文件。

程序移植

由於我的是簡單的命令行程序,所以將所有的代碼都放到了MainWindow類裏,移植時請注意變量生命週期。

設計圖形界面

雙擊“項目”中“Forms文件夾”下的.ui文件,啓動QT Designer,然後就可以通過拖拽的方式設計界面了。

在這裏插入圖片描述

默認已經創建了一個內容空白、有狀態欄和菜單欄的窗口(狀態欄和菜單欄均可以刪除),可以從左側的控件菜單中將控件拖動到窗口裏並自由排版。在右下角的屬性窗口設置控件的具體屬性,在右上角的對象查看器中可以瀏覽和編輯當前窗體的層次。

我的圖形界面只用到了文本輸入框(Text Edit)、標籤(Label)、文本瀏覽框(Text Browser)、按鈕(Push Button)這四個控件(使用其它控件的步驟也是差不多的),界面如下:

在這裏插入圖片描述

添加功能

信號和槽

設置完界面後,就希望添加各種功能,比如點一下按鈕就做開始處理這個,當文本輸入框中的文字改變後校驗一下文字符不符合要求之類的。要實現這樣的功能,就需要用到QT的信號機制,信號是有對象或控件發送的消息,槽可以接受和響應信號,本質上是函數或方法。每個控件都自帶了很多信號(也可以自定義,請自行百度),可以自己編寫槽函數,將信號綁定到槽函數上。

比如點擊按鈕然後釋放,就會發出clicked信號,可以自己編寫一個函數,將這個clicked信號綁定到這個函數上,即可實現點擊按鈕處理事務的功能。

查看信號

  1. 每個控件都屬於一個類,可以到百度上搜索這個類有哪些信號,也可以查閱官方文檔。
  2. 可以使用QT Designer查看每個控件擁有的信號(參考博客在下一步)。

綁定信號和槽

參考博客:Qt信號和槽函數的四種實現方式

推薦第三種,使用connect的方法,畢竟可以自定義方法名。

以第三種方法和這個項目爲例,介紹一下實現過程:

在QT Designer左上角的對象查看器中的可以查到按鈕的對象名爲pushButton。假設我現在需要用到該按鈕的clicked信號,希望點擊按鈕後能執行myFunc函數,myFunc函數會對窗口做一系列的操作。

在mainwindow.h的MainWindow類(如果你定義了類名的話就不是這個類了)的定義中添加代碼:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:         //添加
    void myFunc(void); //添加,沒有參數,我寫的時候是把要用到的參數都放到了類裏

private:
    Ui::MainWindow *ui;
};

在mainwindows.cpp中實現myFuc函數:

void MainWindow::myFunc(void){
    //總的來說操作窗口控件就是通過指針調用方法。
    ui->label->setText("111");  //修改Label標籤顯示的值爲111
    QString inText=ui->textEdit->document()->toPlainText();  //獲取Text Edit中的內容(簡單文本內容),並保存爲Qstring類型
    QMessageBox::information (NULL,"成功","你成功了!"); //彈出一個自帶一個確認按鈕的消息框,需要  #include <QMessageBox>
}

在MainWindows類的構造函數中添加:

connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(myFunc()));

若需在使用槽函數時傳遞參數,如果要使用信號自帶的參數時,可以參考這篇博客:信號槽如何傳遞參數。如果想要自定義參數,可以參考這篇博客:Qt中connect函數不能傳遞參數的兩種解決方法。當然也可以把需要用到的數據都保存到類裏,然後在執行函數時讀取。

需要注意的一些問題

很多控件使用的不是String類型的字符串或char*型的C字符串(比如Label的setText()方法),而是QString類型,這是QT自帶的類,用於字符串處理。所以需要進行轉換,轉換請自行百度。比如這篇:0022:Qt常用類 - QString(01,QString的編碼方式和初始化)

編譯和發佈應用

在QT Creator的左下角可以選擇編譯器和編譯類型,如果是要最終發佈,請選擇構建類型爲Release,然後點擊那個錘子形狀的圖標。

發佈應用參考博客:Windows平臺上的應用程序發佈

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