文章目錄
- 使用編輯框來完成 hello world
- 通過編輯圖形化界面方式
- 通過純代碼方式
- 通過按鈕的方式來創建 hello world
- 通過編輯圖形化界面方式
- 通過純代碼方式
- 總結Qt Creator中的快捷鍵
- 如何使用文檔
- 命名規范
簡介:這篇文章著重點并不在于創建
hello world
程序,重點是放在控件按鈕(push Button)與 connect 的神級配合
,這樣當我們去點擊界面上的按鈕控件時,就會執行按鈕所關聯的處理函數,此時界面就會發生變化。而這個媒介就是connect,同時補充一點Qt的使用知識和規范,這樣代碼寫的越輕松,越規范,越自信。邀請各位看官好友一起瀏覽
使用編輯框來完成 hello world
這里主要是使用編輯框來完成
hello world
,可以使用單行編輯框QLineEdit
和多行編輯框QTextEdit
通過編輯圖形化界面方式
跟之前的
label
控件操作并無區別,而編輯框實現hello world
并不是這節的重點,通過按鈕控件
實現hello world
才是重點所在
不過這里與
label
控件實現hello world
方式不同的是,它輸出的內容是可以編輯的
通過純代碼方式
這里純代碼方式去實現
hello world
的也是根據label控件
依葫蘆畫瓢哈
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QLineEdit>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLineEdit* LineEdit = new QLineEdit(this);LineEdit->setText("hello world");
}Widget::~Widget()
{delete ui;
}
通過按鈕的方式來創建 hello world
通過編輯圖形化界面方式
也通過推拽控件
Push Button
去創建hello world
,但是這里比之前的label
與Line Edit
控件有更加高級
玩法,按鈕,那肯定是按下去會出現什么反應或者變化,因此這里就牽扯到Qt 中的信號槽機制
,它的本質就是給按鈕的點擊操作關聯上一個處理函數,當用戶點擊的時候就會執行這個處理函數,隨之發生變化
這里的特殊玩法就是點擊這個按鈕讓這個文本內容(
hello world
)切換成This is my world
,但這里并不是只去編輯圖形化界面,它需要結合代碼共同去完成這個操作,未來的學習很大程度上也需要借助圖形化界面
,先展示修改文件的代碼,再對其進行闡述
void handleClick();
該函數就是該按鈕的點擊操作關聯上的一個處理函數,按鈕被點擊之后,就把按鈕中的文本進行切換
// Widget.h(只保留關鍵代碼)
#include <QWidget>
#include<QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handleClick();
private:Ui::Widget *ui;
};
#endif // WIDGET_H
介紹connect
;connect這個單詞它本身就具有聯系,連接
的意思,在Linux的網絡編程中也存在一個函數叫做connect
,這個函數是用來給TCP socket
建立連接的(在寫 TCP 客戶端的時候,需要先建立連接,然后才能讀寫數據)。而Qt 中的 connect 是 QObject 這個類提供的靜態函數,這個函數的作用就是連接信號與槽
,不過它和 TCP 的建立連接操作沒有任何關系,只是同一種術語的不同意思解釋connect的四個參數
;第一個參數(ui->pushButton)
:誰發出的信號。第二個參數(&QPushButton::clicked)
:點擊按鈕的時候就會自動觸發這個信號,發出了一個啥信號。第三個參數(this)
:誰來處理這個信號。第四個參數(&Widget::handleClick)
:接收信號后,具體怎么處理。
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{// 當按鈕被點擊之后,就把按鈕中的文本進行切換if(ui->pushButton->text() == QString("hello world")){ui->pushButton->setText("This is my world");}else{ui->pushButton->setText("hello world");}
}
這里要詳述
ui->pushButton
;就是去訪問form file(file文件)
中創建的控件。通過下方的圖片能看到:Qt 工具會自動幫我們生成一個類名(可以手動修改)為 pushButton(objectName) 的 QPushButton類
,也就是在 Qt Designer中創建一個控件的時候,此時就會給這個控件去分配一個objectName
屬性,且這個屬性的值要求是在界面中得是唯一的(不能重復)。而qmake在預處理.ui
文件的時候就會根據這里的objectName
生成對應的C++代碼,變量 pushButton 就成為 ui 屬性中的成員變量
。結合圖片更好理解哈
此時按鈕對象,是不需要咱們自己 new出來的, new 對象的操作已經是被 Qt 自動生成了,而且這個按鈕對象已經作為ui對象里的一個成員變量了(直接繼承就OK,也無需作為Widget 的成員)
通過純代碼方式
對于純代碼版本,按鈕對象是咱們自己 new的,為了保證其他函數中能夠訪問到這個變量,就需要把按鈕對象設定為 Widget 類的成員變量
// Widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QPushButton>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();// 點擊按鈕后要進行的切換操作void handleClick();private:Ui::Widget *ui;// 得有一個QPushButton成員變量QPushButton* myButton;};
#endif // WIDGET_H
// Widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 老樣子,創建對象,在connectmyButton = new QPushButton(this);myButton->setText("hello world");connect(myButton, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{if (myButton->text() == QString("hello world")){myButton->setText("This is my world");}else{myButton->setText("hello world");}
}
那實際開發中,是通過代碼的方式構造界面為主,還是通過圖形化界面的方式構造界面為主?首先這兩種都很主要,難分主次!
如果你當前程序界面,界面內容是比較固定的,此時就會以圖形化的方式來構造界面。但是如果你的程序界面,經常要動態變化,此時就以代碼的方式來構造界面。這兩種方式,哪種方便就用哪種,而且這兩種方式也可以配合使用,在后面的學習中,這兩種方式會穿插使用
總結Qt Creator中的快捷鍵
- 注釋:
ctrl + /
- 運行:
ctrl + R
- 編譯:
ctrl + B
- 字體縮放:
ctrl + 鼠標滑輪
- 查找:
ctrl + F
- 整行移動:ctrl + shift + ↑/↓
- 自動對齊:
ctrl + i
- 查找某個函數文檔:
鼠標對準F1
- 同名
.h
與.cpp
切換:F4
- 生成函數聲明的定義:
alt + enter
如何使用文檔
- 直接將光標放到要查詢的類名/方法名上,直接按F1
- 點擊Qt Creator左側邊欄中的 “幫助” 按鈕
- 直接在搜索欄中搜索
Assistant
注意在未來的實際開發中,一定會用到很多的第三庫和框架的。那很可能用到的庫/框架,比較小眾,這時網上就很難去找到我們所需要的相關資料,那就只能去參考官方文檔,而官方文檔大概率是英文的,因為如果它的程序要走向國際化,它肯定是有一份英譯的參考資料,所以得去習慣去讀英文文檔
命名規范
去給變量/函數/文件/類 取名字,是非常有講究的,首先起的名字要有描述性,不要使用a/b/c/d這種無規律的名字去描述變量,其次如果名字比較長的話,由多個單詞構成,就需要使用適當的方式來進行區分不同的單詞,因此總共有兩種典型的命名風格
蛇形命名法
和駝峰命名法
蛇形命名法
;偏好使用_來進行單詞的分割,主要用于C/C++/Python。比如:unordered_map,priority_queue
駝峰命名法
;偏好使用大寫字母進行單詞的分割,主要用于Java/JS/Go。比如:QApplication,QWidget
- 兩種命名方法都可以去使用,但咱講究的是入鄉隨俗,進入公司后,公司的項目使用的是哪種命名風格就用哪種方法