Qt是當今很流行的一種跨平台 GUI 框架,但是發展到如今,他的功能已經不局限於開發GUI應用程序 , 他也可以開發許多的非GUI程序和服務器程序等
Qt的入門比較簡單,下面以常見的Hello World程序來開始Qt的學習
1 #include <QApplication> 2 #include<QLabel> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 8 QLabel msg("Hello World"); 9 msg.show(); 10 11 return a.exec(); 12 }
<QApplication>是一個應用程序類所在的頭文件 , 每個Qt程序都要包含該頭文件,每次寫程序的時候只要包含他就OK了
然后在main中實例化一個應用程序類的對象
QApplication a(argc,argv);
<QLabel>是 QLabel類所定義的都文件
QLabel 是一個窗口部件 (widget)。窗口部件相當於windows中的控件 和 容器。就是說,窗口部件既可以包含其他的窗口部件,又可以被其他的窗口部件包含。\
例如菜單,滾動條,狀態欄 和 按鈕等 都是窗口部件(widget),他們都繼承自 QWidget 類。
絕大多數的應用程序 用 QMainWindow 或 QDialog 最為應用程序的主窗口 , 但是 Qt 和靈活, 任何一個 窗口部件 都可以作為主窗口使用,例如上面的HelloWorld
程序,就是用QLabel 最為程序的主窗口的。
上面的QLabel 實例化一個 對象 msg , 並讓其text 屬性為 “Hello World” :
QLabel msg("Hello World");
這樣,一個窗口部件就創建出來了。但是,就像windows中的CreateWIndow一樣,窗口只是在內存中創建好了,但是並沒有被顯示出來,要顯示窗口的話,還需要調用
一個函數:void show();
msg.show();
如果學過windows下的GUI編程的話,就會知道這個函數就相當於 ShowWindow();
窗口顯示以后,窗口程序就開始要運行了,窗口也就要開始處理各種事件了。這時候派上用場的就是 exec();
a.exec();
該函數相當於一個循環,在這個循環里,每次循環都檢查窗口上有沒有什么事件發生,例如 鼠標在窗口上點擊啊,鼠標在窗口上划過啊 ,鍵盤被敲下啊 等等。
就類似於windows的消息循環,但此處是 事件循環。到此處,一個Hello World 程序就完成了
另外QLabel 還支持一些簡單的HTML樣式格式,例如
1 #include <QApplication> 2 #include<QLabel> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 QLabel msg("<a href=\"http://www.baidu.com/\">Baidu</a>");//此處的就是讓label上的文字以鏈接的形式現實出來 8 msg.show(); 9 10 return a.exec(); 11 }
就像上面的兩個類那樣,Qt中 , 所有的框架提供的類都以字母 Q 開頭, 所有的類對應着一個 以其 類名 命名的 頭文件。如果你想使用某一個類,只要包含
其相應的頭文件即可。
下面繼續來看Qt中的信號和槽機制。 信號和槽 機制 簡單的來說就是 一個對象身上發生了某個事件 , 其通過某種手段 將發生的時間 通知另一個對象 , 然另一個
對象用某種手段來處理 發生的事件 。 用 信號 和 槽來命名很形象 , A 發生了某件事 , A 就發送一個 信息(就是信號) 給 B , B 有一個專門接受信息的 天線(就是槽)
B受到A發來的信息后 , 就開始做一些特定的事情 ( 有點遠程控制的味道)。
信號和槽可以通過QObject::connect(A , signal<something happened > , B , slot<do something> )來關聯
下面來看 信號-槽 的一個實例
1 #include <QApplication> 2 #include<QPushButton> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 8 QPushButton msg("Hello World"); 9 msg.show(); 10 11 QObject::connect(&msg,SIGNAL(clicked()),&msg,SLOT(close())); 12 13 return a.exec(); 14 }
上面就是一個簡單的 信號-槽 的使用 , 當PushButton 身上發生一個鼠標點擊的事件時 , 就發送一個信號 clicked() 給他自身 , 他自身收到 clicked()信號后 , 就
執行一個動作 , 此處的動作就是close()關閉 , 可以發現 該程序 運行時,如果點擊一下 PushButton , 程序就退出了
窗口部件的布局:
窗口部件的布局就是 處理widget 如何格式化擺放的問題的 。 下面先接觸3個類
- QHBoxLayout
- 這個類用於將widget 按橫向排列
- QVBoxLayout
- 這個類用於將widget按縱向排列
- QGridLayout
- 這個類用於將widget按網格狀排列,一般在 將部件分組分別進行橫豎排列后,再進行網格排列
下面是這三個類的使用實例
1 #include <QApplication> 2 #include<QPushButton> 3 #include<QSpinBox> 4 #include<QSlider> 5 #include<QHBoxLayout> 6 #include<QVBoxLayout> 7 #include<QGridLayout> 8 9 int main(int argc, char *argv[]) 10 { 11 QApplication a(argc, argv); 12 //創建各個窗口部件並初始化 13 QWidget* window = new QWidget; 14 QPushButton* btn1 = new QPushButton("b1"), 15 *btn2 = new QPushButton("b2"); 16 QSlider* slider = new QSlider; 17 QSpinBox* spinbox = new QSpinBox; 18 slider->setRange(0,200); 19 spinbox->setRange(0,200); 20 21 //創建窗口的布局 22 QHBoxLayout* hLayout = new QHBoxLayout; 23 QVBoxLayout* vLayout = new QVBoxLayout; 24 QGridLayout* gridLayout = new QGridLayout; 25 //btn1 和 slider 排成一排 26 hLayout->addWidget(btn1); 27 hLayout->addWidget(slider); 28 //btn2 和 spinbox 排成一列 29 vLayout->addWidget(btn2); 30 vLayout->addWidget(spinbox); 31 //將兩組widget排列到網格中 32 gridLayout->addLayout(hLayout,0,0,1,2); 33 gridLayout->addLayout(vLayout,3,3,2,1); 34 //把布局應用到主窗口中 35 window->setLayout(gridLayout); 36 //設置 信號-槽 的關聯 37 QObject::connect(slider,SIGNAL(valueChanged(int)), 38 spinbox,SLOT(setValue(int))); 39 QObject::connect(spinbox,SIGNAL(valueChanged(int)), 40 slider,SLOT(setValue(int))); 41 //顯示窗口 42 window->show(); 43 44 return a.exec(); 45 }
該程序的運行結果如下