以 「Hello Qt」 爲例,介紹如何創建一個 Qt 工程 。c++
QLabel 用來顯示文本和圖片,它繼承自 QFrame (而 QFrame 繼承自 QWidget)編程
#1 和 #2 標明頭文件,也可用一個總的來代替: #include <QtWidgets>app
#6 建立 QApplication 類對象,配合 #11 使整個程序進入事件循環狀態,等待用戶的動做;ide
#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>");
下面程序由於簡短,關閉後,操做系統會負責回收內存,可是這種 new 了以後不 delete 的方式是不推薦的。ui
8 QLabel *label = new QLabel("Hello Qt!"); 9 label->show();
若是使用指針,能夠考慮 Qt 中的智能指針 QScopedPointerspa
QScopedPointer<QLabel> label(new QLabel("Hello Qt!"));
也可以使用 c++ 中的智能指針 std::unique_ptr,注意包含頭文件 #include <memory>操作系統
std::unique_ptr<QLabel> label = std::make_unique<QLabel>("Hello Qt!");
使用 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 }
界面以下:
實現以下界面,包含 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/