Qt 之 入門例程


  以 “Hello Qt” 為例,介紹如何建立一個 Qt 工程 。

1  QLabel 例程

  QLabel 用來顯示文本和圖片,它繼承自 QFrame (而 QFrame 繼承自 QWidget)

1.1  Hello Qt

  #1 和 #2 標明頭文件,也可用一個總的來代替: #include <QtWidgets>

  #6 創建 QApplication 類對象,配合 #11 使整個程序進入事件循環狀態,等待用戶的動作;

  #8 創建 QLabel 對象 label 並賦初值 “Hello Qt!”, 接着 #9 顯示出該對象。

 1 #include <QApplication>
 2 #include <QLabel>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication app(argc, argv);
 7 
 8     QLabel label("Hello Qt!");
 9     label.show();
10 
11     return app.exec();
12 }

  自動生成的工程配置文件 .pro 如下:

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = HelloQt
TEMPLATE = app

SOURCES += main.cpp

  支持 HTML 風格

QLabel label("<h2><i>Hello</i>" "<font color=red>Qt!</font></h2>");

 

1.2  智能指針

  下面程序因為簡短,關閉后,操作系統會負責回收內存,但是這種 new 了之后不 delete 的方式是不推薦的。

8  QLabel *label = new QLabel("Hello Qt!");
9  label->show(); 

1)  Qt 的智能指針

  如果使用指針,可以考慮 Qt 中的智能指針 QScopedPointer

 QScopedPointer<QLabel> label(new QLabel("Hello Qt!"));

2)  c++ 的智能指針

  也可使用 c++ 中的智能指針 std::unique_ptr,注意包含頭文件 #include <memory>

std::unique_ptr<QLabel> label = std::make_unique<QLabel>("Hello Qt!");

  

2  QPushButton 例程

  使用 QPushButton 類,新建一個按鈕指針 btn,設置其父窗口為 &window,這樣當 window 被銷毀,就會自動刪除 btn,這其實是 Qt 中特有的“擁有權”問題,它可使編程中 new 了不用 delete

  connect 將信號 clicked() 和槽函數 quit() 連接了起來,當點擊按鈕時,clicked() 信號被發出,接着槽函數被執行,於是程序退出。這稱為 "信號槽" 機制

 1 #include <QtWidgets>
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     QApplication app(argc, argv);
 6 
 7     QWidget window;
 8     window.resize(200, 150);
 9     window.setWindowTitle("Button");
10     window.show();
11 
12     QPushButton *btn = new QPushButton("Quit", &window);
13     QObject::connect(btn, SIGNAL(clicked()), &app, SLOT(quit()));
14     btn->move(50,50);
15     btn->show();
16 
17     return app.exec();
18 }

  界面如下:

 

 

3  QSpinBox 和 QSlider

  實現如下界面,包含 spinbox 和 slider 兩個控件,且二者的數值互相關聯。
   

    #1 ~ #4 包含所需頭文件,#10 和 #11 新建窗口部件,作為頂層窗口 (top-level), #13 ~ #16 新建 spinbox 和 slider 控件指針,取值范圍 0~130;

    #18 和 #19 將二者連接起來, 使得 spinbox 和 slider 的數值保持實時同步; #22 新建 layout 布局管理器指針;

    #23 和 #24 將兩個控件加入布局管理器 layout 中, #26 在窗體部件上安裝布局管理器 layout,此時 QHBoxLayout 以及它包含的 QSpinBox 和 QSlider 會自動 "重新定義" 父窗口,QWidget 會取得它們的所有權,這也是它們在創建時沒有設置父窗口的原因; #27 顯示出整個窗體部件。

 1 #include <QApplication>    // #include <QtWidgets>
 2 #include <QHBoxLayout>     
 3 #include <QSpinBox>
 4 #include <QSlider>   
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication app(argc, argv);
 9 
10     QWidget window;
11     window.setWindowTitle("Enter Your Age");
12 
13     QSpinBox *spin = new QSpinBox;
14     QSlider *slider = new QSlider(Qt::Horizontal);
15     spin->setRange(0,130);
16     slider->setRange(0,130);
17 
18     QObject::connect(spin, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
19     QObject::connect(slider, SIGNAL(valueChanged(int)), spin, SLOT(setValue(int)));
20     spin->setValue(35);
21 
22     QHBoxLayout *layout = new QHBoxLayout;
23     layout->addWidget(spin);
24     layout->addWidget(slider);
25 
26     window.setLayout(layout);
27     window.show();
28 
29     return app.exec();
30 }

  Qt 中有三個布局管理器類,分別是水平布局管理器 (QHBoxLayout), 垂直布局管理器 (QVBoxLayout), 以及網格布局管理器 (QGridLayout)

  這些布局管理器,可以為加入其中的控件自動分配位置和尺寸大小,省卻了手動布局畫圖的繁瑣。

 

參考資料:

  <C++ GUI Programming with Qt4>  2nd chapter 1

  <Qt 5.9 | All Qt Examples> Widgets Tutorial - Child Widgets

  <Qt 學習之路2>  豆子   https://www.devbean.net/2012/08/qt-study-road-2-hello-world/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM