Qt入门——三个臭皮匠顶个诸葛亮
生活随笔
收集整理的這篇文章主要介紹了
Qt入门——三个臭皮匠顶个诸葛亮
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本篇博客主要介紹如何把基本的C++知識與Qt所提供的功能組合起來創建一些簡單的圖形戶用界面(Graphical User Interface,GUI)應用程序。關鍵在于理解Qt中的兩個重要的概念:其一是“信號與槽”;其二是“布局”。
1.從Hello Qt談起
先從一個非常簡單的Qt程序開始。一行一行的研究這個程序。 <span style="font-size:18px;">#include <QApplication> #include <QLabel> int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel *label = new QLabel ("Hello Qt");label->show();return app.exec(); }</span>第一行和第二行包含了類QApplication和QLabel的定義。對于每個Qt類,都有一個與該類同名且大寫的頭文件,這個頭文件中包含了對該類的定義。 第五行創建了一個QApplication對象,用來管理整個應用程序所用到的資源。這個QApplication構造函數需要兩個參數,分別是argc和argv,因為Qt支持他自己的一些命令行參數。 第六行創建一個顯示“Hello Qt”的QLabel窗口部件(widget)。在Qt和UNIX的術語中,窗口部件就是用戶界面中的一個可視化元素。該詞起源于“window gadget”這兩個詞,它相當于Windows系統術語中的“控件control”和“容器container”。按鈕、菜單、滾動條和框架都是窗口部件。窗口部件也可以包含其他窗口部件,例如,應用程序的窗口通常就是一個包含了一個QMenuBar、一些QToolBar、一些QStatusBar以及一些其他窗口部件的窗口部件。絕大多數應用程序都會使用一個QMainWindow或者一個QDialog來作為他的窗口。但是,不可否認的是,Qt十分的靈活,任意的窗口部件都可以作為他的窗口。在上面的例子中,就是采用了窗口部件QLabel作為應用程序的窗口的。 第七行使QLabel標簽可見。在創建窗口部件的時候,標簽通常都是隱藏的,這就允許我們可以先對其進行設置然后在顯示他們,從而避免了窗口部件有閃爍現象。 第八行將應用程序的控制權傳遞給Qt。此時,程序會進入事件循環狀態,這是一種等待模式,程序會等候用戶的動作,例如鼠標單擊和按鍵等操作。用戶的動作會讓可以產生相應的的程序生成一些時間(event,也稱為消息),這里談到的響應其實就是執行一個或多個消息響應函數。 為了簡單起見,上面的程序沒有過多關注在main()函數末尾對QLabel對象的delete操作調用。在如此短小的程序內,這樣一點點的內存泄漏(memory leak)問題無關大局,因為在程序結束時,這部分內存是可以有操作系統重新回收的。 測試結果如下圖所示:2.如何響應用戶操作
下面的例子是要說明如何響應y用戶的動作。該應用程序由一個按鈕構成,用戶可以單擊這個按鈕退出程序。除了應用程序的主窗口部件使用的是QPushButton而不是QLabel之外,該程序的源代碼和上面的極其相似。該段程序演示的目的就是為了理解如何將用戶的一個動作與一段代碼連接起來。 <span style="font-size:18px;">#include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton *button = new QPushButton("Quit");QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit()));button->show();return app.exec(); } </span>Qt的窗口部件通過發射信號(signal)來表明一個用戶動作已經發生了或者是一個狀態已經改變了。例如,當用戶單擊QPushButton時,該按鈕就會發射一個click()信號。信號可以與函數(在這里稱為槽,slot)相連接,以便在發射信號時,槽可以得到自動執行。上面那個例子,就是把這個按鈕的click()信號與QApplication對象的quit()槽連接起來。宏SIGNAL()和SLOT()是Qt語法中的一部分。 經過編譯,運行結果如下圖所示。如果點擊Quit按鈕,或者是按下空格鍵,那么將會退出應用程序。3.窗口部件的布局
該例主要創建一個簡單的程序,旨在說明如何應用布局(Layout)來管理窗口中窗口部件的幾何形狀,還要說明如何應用信號和槽來同步窗口部件。 #include <QApplication> #include <QHBoxLayout> #include <QSlider> #include <QSpinBox> int main(int argc, char *argv[]) {QApplication app(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(slider);layout->addWidget(spinbox);window->setLayout(layout);window->show();return app.exec(); } 運行結果: 這個應用程序有三個窗口部件組成:一個QSpinBox、一個QSlider和一個QWidget。QWidget是這個應用程序的主窗口。QSlider和QSpinBox會顯示在QWidget中,他們都是QWidget窗口部件的子對象。換言之,QWidget窗口部件是QSpinBox和QSlider的父對象。QWidget窗口部件自己則沒有父對象,因為程序是把他當成頂層窗口。QWidget的構造函數以及他的所有子類都會帶一個參數QWidget*,用來說明誰是他們的父窗口部件。 QWidget *window = new QWidget; window->setWindowTitle("Enter your Age"); 創建了QWidget對象,并把它作為應用程序的主窗口。通過調用setWindowTitle()函數來設置像是在窗口標題欄上的文字。 QSpinBox *spinbox = new QSpinBox; QSlider *slider = new QSlider (Qt::Horizontal); spinbox->setRange(0,130); slider->setRange(0,130); 分別創建了一個QSpinBox和一個QSlider,并設置了他們的有效范圍。其實,我們本應該把這個窗口傳遞給QSpinBox和QSlider的構造函數,以說明這兩個窗口部件的父對象都是這個窗口,但是,在這里沒有這個必要,因為布局系統將會自行得出這一結果,并自動把該窗口設置為微調框和滑塊的父對象。 QObject::connect(spinbox,SIGNAL(valueChanged(int)), slider,SLOT(setValue(int))); QObject::connect(slider,SIGNAL(valueChanged(int)), spinbox,SLOT(setValue(int))); 調用了兩次QObject::connect(),這是為了確保能夠讓微調框和滑塊同步,以便他們兩個總是可以顯示相同的數值。一旦一個窗口部件的值發生了改變,那么就會自動發射出他的valueChange(int)信號,而另一個窗口部件就會用這個新值調用它的setValue(int)槽。 QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(slider); layout->addWidget(spinbox); window->setLayout(layout); 使用了一個布局管理器對微調框和滑塊進行布局處理。布局管理器(layout manager)就是一個能夠對其所負責窗口部件的尺寸和位置進行設置的對象。Qt有三個主要的布局管理器類: #QHBoxLayout:在水平方向排列窗口部件,從左到右; #QVBoxLayout:在豎直方向上排列窗口部件,從上到下; #QGridLayout:把各個窗口部件排列在一個網格中。 其中,QWidget::setLayout()函數調用會在窗口上安裝該布局管理器。從軟件的底層實相上來說,QSlider和QSpinBox會自動“從定義父對象”,他們會成為這個安裝了布局的窗口部件的子對象。也正是這種原因,當創建一個需要放進某個不居中的窗口部件時,就沒有必要為其顯式地指定父對象了。 經管我們沒有明確地設置任何一個窗口部件的位置和大小,但QSpinBox和QSlider還是能夠非常好看的一個挨一個地顯示出來。這是因為QHBoxLayout可以根據所負責的子對象的需要為他們分配所需的位置個大小。布局管理器使我們從應用程序的各種屏幕位置關系指定的復雜中脫離出來。此外,最大的好處莫過于這可以確保窗口尺寸大小發生改變時的平穩性。4.小結
Qt中構建用戶接口的方法很容易理解并且非常靈活。Qt程序員最常用的方式就是先聲明所需的窗口部件,然后在設置他們所應具備的屬性。程序員把這些窗口部件調價到布局中,布局會自動設置它們的大小和位置。利用Qt的信號和槽機理,并通過窗口部件之間的連接就能夠管理用戶的交互行為。所以看出,Qt確實要比MFC具有更廣闊的發展前景。總結
以上是生活随笔為你收集整理的Qt入门——三个臭皮匠顶个诸葛亮的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【飞秋】做需求分析一点心得
- 下一篇: 技术面试的《飞鸽传书2007绿色版下载》