一、前言
作為第三篇的最后一部分,我們來看一下Qt的控件,談到控件,就會讓人想到界面的美觀性和易操作性,進而想到開發的便捷性。作為windows界面開發的MFC曾經是盛行了多少年,但是其弊端也隨着其他界面庫的面世而不斷的被放大,對於一個剛學會C或者C++轉而學習windows界面開發的新手來說,MFC的控件和界面設計抽象而且復雜,也許現在你還記得MFC控件重繪比其他界面庫多花費的時間,走過的彎路,調過的bug。因此,我們現在來看看Qt會不會帶給我們不一樣的體驗,Let‘s go。
二、控件介紹
2.1 按鈕組(Buttons)
對於按鈕的展示和操作,我們直接通過圖片和代碼的方式來展示。

Push Button:按鈕
Tool Button:工具按鈕
Radio Button:單選按鈕
Check Box:復選框
Command Link Button:命令連接按鈕
Dialog Button Box:窗口按鈕盒
2.1.1 按鈕實例
1 #include "mywidegt.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MyWidegt w; 8 /*設置主窗體的位置和初始大小*/ 9 w.setGeometry(100,100,200,100); 10 w.show(); 11 return a.exec(); 12 }
1 #ifndef MYWIDEGT_H 2 #define MYWIDEGT_H 3 4 #include <QWidget> 5 6 class MyWidegt : public QWidget 7 { 8 Q_OBJECT 9 10 public: 11 MyWidegt(QWidget *parent = 0); 12 ~MyWidegt(); 13 }; 14 15 #endif // MYWIDEGT_H
1 #include "mywidegt.h" 2 #include <qapplication.h> 3 #include <qpushbutton.h> 4 #include <qfont.h> 5 6 MyWidegt::MyWidegt(QWidget *parent) 7 : QWidget(parent) 8 { 9 /*設置對話框的最小顯示尺寸*/ 10 setMinimumSize(200,120); 11 /*設置對話框的最大顯示尺寸*/ 12 setMaximumSize(1366,768); 13 /*PushButton的構造函數 14 QPushButton::QPushButton(const QString & text, QWidget * parent = 0) 15 */ 16 QPushButton *quit=new QPushButton("Quit",this); 17 /*setGeometry(int x, int y, int w, int h)從坐標(x,y)開始顯示一個w*h大小的界面,范圍不能超過上面設置的尺寸*/ 18 quit->setGeometry(62,40,75,30); 19 /*設置字體 void setFont(const QFont &)*/ 20 quit->setFont(QFont("Times",18,QFont::Bold)); 21 22 connect(quit,SIGNAL(clicked()),qApp,SLOT(quit())); 23 24 } 25 26 MyWidegt::~MyWidegt() 27 { 28 29 }

2.2 輸入控件組(Input Widegets)
輸入控件組(Input Widegets)包含的各個控件的名稱依次如圖所示

Combo Box: 組合框
Font Combo Box: 字體組合框
Line Edit: 行編輯
Text Edit: 文本編輯
Plain Text Edit:文本編輯
Spin Box: 數字顯示框(自旋盒)
Double Spin Box: 雙自旋盒
Time Edit: 時間編輯
Date Edit: 日期編輯
Date/Time Edit: 日期/時間編輯
Dial:撥號
Horizontal Scroll Bar: 橫向滾動條
Vertical Scroll Bar:垂直滾動條
Horizontal Slider: 橫向滑塊
Vertical Slider:垂直滑塊
Key Sequence Edit:快捷鍵編輯
2.2.1 控件類介紹
1、QDateTime類
在Qt5中,可以使用QDateTime類類獲取系統的時間。通過QdateTime::currentDateTime()來獲取本地系統的時間和日期吸納好。可以通過date()和time()來返回datetime中的日期和時間部分,代碼如下。
1 Qlabel *datalabel = new Qlabel(); 2 QdateTime *datatime=new QdateTime(QdateTime::currentDateTime()); 3 datalabel->setText(datatime->date().toString()); 4 datalabel->show();
2、Qtimer類
定時器(Qtimer)的使用很簡單,只需要以下幾個步驟就可以完成定時器的應用。
(1)新建一個定時器
QTimer *time_clock=new Qtimer(parent);
(2)連接這個定時器的信號和槽,利用定時器的timeout()。
connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));
定時時間一到就會發送timeout()信號,從而出發slottimedone()槽去完成某件事情。
(3)開啟定時器,並設定定時周期
開啟定時器有兩種方式,start(int time)和setSingelShot(true)。其中,第一種表示每隔“time”秒就會重啟定時器,可以重復出發定時,利用stop()將定時器關閉;而setSingleShot(true)則是僅啟動定時器一次。工程中常用的是前者,比如 time_clock->start(2000);
2.3 顯示控件組(Display Widegts)
Lbael:標簽
Text Browser:文本瀏覽器
Graphics View:圖形視圖
Calendar: 日歷
LCD Number:液晶數字
Progress Bar:進度條
Horizontal Line:水平線
Vertical Line:垂直線
QDeclarativeView:向QML暴露數據視圖
QQuickWidegt:快速布局
QWebView:web視圖
2.3.1 控件類介紹
(1)Graphics View對應於QGraphicsView類
(2)Text Browser對應於QTextBrowser類。QTextBrowser類繼承自QTextEdit,而且近視只讀的,對立面的內容並不能進行更改,但是相對於QTextEdit來講,它還具有鏈接文本的作用。
2.4 空間間隔組(Spacers)
Horizontal Spacer:水平間隔
Vertical Spacer:垂直間隔
2.5 布局管理組(Layouts)
Vertical Layout: 垂直布局
Horizontal Layout:橫向(水平)布局
Grid Layout:網格布局
Form Layout: 表格布局
2.6 容器組(Containers)
Group Box:組框
Scroll Area:滾動區域
Tool Box:工具箱
Tab Widget:標簽小部件
Stacked Widegt:堆疊部件
Frame :幀
Widget:小部件
MdiArea:MDI區域
Dock Widget:停靠窗口部件
QAxWidget:封裝Flash的ActiveX控件
2.7 項目視圖組(Item Views)
List View:清單視圖
Tree View:樹視圖
Tabel View:表視圖
Column View:列視圖
2.8項目控件組(Item Widgets)
List Widegt:清單控件
Tree Widegt:樹形控件
Tabel Widegt:表控件
三、 綜合樣例

1 #ifndef DIALOG_H 2 #define DIALOG_H 3 4 #include <QDialog> 5 6 namespace Ui { 7 class Dialog; 8 } 9 10 class Dialog : public QDialog 11 { 12 Q_OBJECT 13 14 public: 15 explicit Dialog(QWidget *parent = 0); 16 ~Dialog(); 17 18 private: 19 Ui::Dialog *ui; 20 private slots: 21 void on_lineEdit_textChanged(); 22 }; 23 24 #endif // DIALOG_H
1 #include "dialog.h" 2 #include "ui_dialog.h" 3 4 Dialog::Dialog(QWidget *parent) : 5 QDialog(parent), 6 ui(new Ui::Dialog) 7 { 8 ui->setupUi(this); 9 /*只允許第一個字元輸入大小寫英文字母,后面接一位非0的數字,再接0~2位可為0的數字*/ 10 QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); 11 //設置驗證器,即只能輸入正則要求的類型的輸入 12 ui->lineEdit->setValidator(new QRegExpValidator(regExp,this)); 13 connect(ui->okButton,SIGNAL(clicked()),this,SLOT(accept())); 14 connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(reject())); 15 16 } 17 18 Dialog::~Dialog() 19 { 20 delete ui; 21 } 22 23 void Dialog::on_lineEdit_textChanged() 24 { 25 //當編輯框檢測到有輸入時,將ok按鈕設置為可用 26 ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput()); 27 }
四、 小結
好了,到了這里關於模板庫、工具類和控件的內容就基本說完了,詳細的內容和重點會在以后的學習中相應的有所提及,最后希望自己能夠學得深入,也希望讀者能夠讀完有所收獲。![]()
