C++ GUI Qt4學習筆記(一)
這一章介紹瞭如何把基本的C++只是與Qt所提供的功能組合起來建立一些簡單的圖形使用者介面應用程式。
引入兩個重要概念:一個是“訊號和槽”,另一個是“佈局”。
視窗部件(widget)是使用者介面的一個視覺化元素,相當於windows系統中的“控制元件”和“容器”。任意視窗部件都可以用作視窗。
1.1 Hello Qt
正確安裝Qt4開發環境,建立工程目錄hello,原始碼檔名為hello.cpp,進入hello目錄
#include <QApplication> #include <QLabel> int main(int argc,char * argv[]) { QApplicationapp(argc,argv); //建立一個QApplication的物件,用來管理應用程式所用到的資源,這個QApplication需要兩個引數,分別是argc,argv,因為qt支援它自己的一些命令列引數。 QLabel*label = new QLabel("helloword,i am ghostyu"); //建立一個label視窗部件,不用多說,c++執行new操作,在堆中建立的label指標,注意程式中的*label最後併為通過delete銷燬,程式退出後,由作業系統收回堆記憶體。 label->show(); //呼叫顯示方法。 returnapp.exec(); //將應用程式的控制權傳遞給qt,此時,程式會進入時間迴圈狀態,這是一種等待模式,等待使用者的動作。 }
(1)#qmake -project
生成一個與平臺無關的專案檔案hello.pro
(2)#qmake hello.pro
生成一個與平臺相關的makefile檔案
(3)#make
構建改程式
linux下執行該程式
#./hello
2.建立連線,響應使用者的動作(將使用者事件與視窗部件建立聯絡,以相應使用者動作)
Qt的視窗部件通過發射訊號(signal)來表明一個使用者動作已經發生了或者是一個狀態已經改變了。訊號可以與槽(slot)相連線,以便在發射訊號時,槽可以得到自動執行。
SIGNAL()和SLOT()是Qt語法中的一部分。
注意:QObject::connect()裡接受者物件前面加採用引用&app#include <QApplication> #include <QLabel> #include <QPushButton> int main(int argc,char *argv[]) { QApplicationapp(argc,argv); QPushButton*button = new QPushButton("quit"); <span style="font-size:16px">//注意一定要有後面的new QPushButton</span> QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit())); <span style="font-size:16px">//QObject::connect(傳送者,什麼訊號,接受者,怎麼辦)</span> button->show(); returnapp.exec(); }
3.視窗部件的佈局
佈局(layout)
QHBoxlayout 從左到右水平排列
QVBoxLayout 從上到下豎直排列
QGridLayout 把各個視窗排列在一個網格里
Qt程式設計師最常使用的構建使用者介面的方法是先宣告所需的視窗部件,然後再設定它們所對應具備的屬性,然後把這些視窗不見新增到佈局中,佈局會自動設定它們的位置和大小。利用Qt的訊號和槽機理,並通過視窗部件之間的連線就可以管理使用者的互動行為。
#include <QApplication> #include <QHBoxLayout> #include <qslider.h> //滑動條 #include <qspinbox.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *window = new QWidget; window->setWindowTitle("enter your age"); QSpinBox *spinBox = new QSpinBox; QSlider *slider = new QSlider( Qt::Horizontal ); spinBox->setRange(0, 130); slider->setRange(0, 130); QObject::connect(spinBox, SIGNAL(valueChanged(int)),slider,SLOT(setValue(int))); QObject::connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int))); spinBox->setValue( 35 ); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(spinBox); layout->addWidget(slider); window->setLayout(layout); window->show(); return a.exec(); } Project 3:控制元件使用 #include <QApplication> #include <QSlider> // 滑動條 #include <QSpinBox> //旋轉盒 #include <QHBoxLayout> //水平排列 int main(int argc,char *argv[]) { QApplication app(argc,argv); QWidget *par=new QWidget;//宣告一個QWidget作視窗 par->setWindowTitle("Enter Your Age");//設定視窗的標題 QSlider *slider=new QSlider;//宣告一個滑動條 QSpinBox *spinBox=new QSpinBox;//宣告一個旋轉盒 slider->setRange(0,100);//設定滑動條的範圍 spinBox->setRange(0,100);//設定旋轉盒的取值範圍 QObject::connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int)));//滑動條值變化引起旋轉盒值的變化 QObject::connect(spinBox,SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));//旋轉盒值的變化引起滑動條值的變化 ,這裡的兩個就不用加& 因為沒有本質改變這兩個控制元件 spinBox->setValue(35);//初始一個spinBox的值 //佈置一下控制元件格局layout QHBoxLayout *layout=new QHBoxLayout;//宣告一個佈局 layout->addWidget(spinBox);//把兩個控制元件加到格局中 layout->addWidget(slider);//格局有了,把視窗的格局設定成這個 par->setLayout(layout); par->show(); return app.exec(); } //細節總結:QWidget類->setWindowTitle("blabla");QWidget類->setLayout(某layout類成員); 宣告。觸發事件的連線QObject::connect(); 宣告橫向的QSlider slider=new slider(Qt::Horizontal) 新遇到的類:QHBoxLayout橫向排列; QVBoxLayout垂直排列;QGridLayout按矩陣方式排列 雖然我們還沒有看見spinBox 和slider 控制元件的大小和位置,它們已經水平排列好了。 QHBoxLayout 能合理安排它們。我們不用在程式中考慮控制元件在螢幕上的大小和位置這些頭 疼的事情了,交給佈局管理器就萬事大吉。 在Qt 中建立使用者介面就是這樣簡單靈活。程式設計師的任務就是例項化所需要的控制元件,按 照需要設定它們的屬性,把它們放到佈局管理器中。介面中要完成任務由Qt 的signal 和 slot 完成。
4.Qt參考文件
Qt Assistant
UNIX下在終端輸入assistant命令,通過繼承得到的函式的文件會顯示在它的基類中。