QT環境準備
推薦Ubuntu平臺上使用,配置簡單,坑少。
Ubuntu 20.04
安裝
sudo apt-get install qt5-default -y
sudo apt-get install qtcreator -y
sudo apt-get install -y libclang-common-8-dev
啟動
qtcreator
HelloWorld
- 打開 Qt Creator。
- 選擇 “New Project”。
- 選擇 “Application” > “Qt Widgets Application”。
- 輸入項目名稱和位置,然后點擊 “Next”。
- 選擇合適的構建工具(例如, 默認的 Qt 版本),然后點擊 “Next”。
- 點擊 “Finish” 完成項目創建。
- 修改代碼,mainwindow.cpp
- 選擇菜單中的 “Build” > “Build Project” 來構建項目。
- 然后選擇 “Run” > “Run Project” 來運行程序。
- 當你運行程序時,會看到一個窗口,窗口中央顯示 “Hello, World!” 的文本。
文件結構
dd@dd-Virtual-Machine:~/work/workspace/helloworld$ tree
.
├── helloworld.pro
├── helloworld.pro.user
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui0 directories, 6 files
-
helloworld.pro:
- 這是 Qt 項目的項目文件,使用 Qt 的 qmake 工具進行構建。它包含了項目的配置信息,例如:
- 項目名稱
- 需要的 Qt 模塊(如
core
,gui
,widgets
等) - 源文件和頭文件的列表
- 資源文件的路徑
- 其他編譯選項
- 該文件是用純文本格式編寫的,通常可以用任何文本編輯器打開和編輯。
示例內容:
TEMPLATE = app TARGET = helloworld QT += widgetsSOURCES += main.cpp \mainwindow.cppHEADERS += mainwindow.hFORMS += mainwindow.ui
- 這是 Qt 項目的項目文件,使用 Qt 的 qmake 工具進行構建。它包含了項目的配置信息,例如:
-
helloworld.pro.user:
- 這是 Qt Creator 自動生成的用戶配置文件,包含了用戶的本地設置,如打開的文件、窗口位置等。通常不需要手動編輯或關注這個文件,它的內容是特定于用戶的。
-
main.cpp:
- 這是應用程序的入口點,包含
main()
函數。在此文件中,通常會創建QApplication
對象和主窗口,并啟動事件循環。
示例內容:
#include <QApplication> #include "mainwindow.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec(); }
- 這是應用程序的入口點,包含
-
mainwindow.cpp:
- 這個文件包含
MainWindow
類的實現代碼。它通常會包括構造函數、析構函數以及其他槽函數的實現。
示例內容:
#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow() {delete ui; }
- 這個文件包含
-
mainwindow.h:
- 這是
MainWindow
類的頭文件,定義了類的接口,包括成員變量、構造函數、析構函數以及槽函數的聲明。
示例內容:
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>namespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui; };#endif // MAINWINDOW_H
- 這是
-
mainwindow.ui:
- 這是 Qt Designer 生成的用戶界面文件,采用 XML 格式,定義了應用程序的圖形界面。你可以使用 Qt Designer 來可視化地創建和編輯這個文件。
- 這個文件描述了窗口中的控件(如按鈕、標簽、文本框等)及其屬性。
示例內容(部分):
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><widget class="QWidget" name="centralWidget"><layout class="QVBoxLayout" name="verticalLayout"><item><widget class="QLabel" name="label"><property name="text"><string>Hello, World!</string></property></widget></item></layout></widget></widget> </ui>
快捷鍵
格式化代碼:Ctrl+A:全選代碼,Ctrl+i:格式化選中內容,Ctrl+s:保存文件,清除僅空格行
示例工程
helloworld.zip
Windows
安裝
qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject
QT基礎知識
在閱讀WT智能柜QT APP過程中,收集APP中使用的QT知識,匯總到本文檔內。
qApp
的含義
qApp
是一個全局指針,指向當前的應用程序對象。它是 QApplication
或 QGuiApplication
的一個實例。通過 qApp
,您可以訪問應用程序的全局狀態和功能。
processEvents()
的功能
processEvents()
方法的主要作用是處理事件隊列中的所有待處理事件。這包括:
- 用戶輸入(例如,鼠標點擊、鍵盤輸入等)
- 定時器事件
- 繪圖事件
- 系統事件
當您調用 qApp->processEvents();
時,Qt 會檢查事件隊列,如果有待處理的事件,它會執行這些事件的處理。這可以幫助保持應用程序的響應性。
使用場景,processEvents()
通常用于以下場景:
- 長時間運行的操作: 在執行耗時的操作(例如,文件處理或網絡請求)時,應用程序可能會變得無響應。通過在長時間運行的操作中定期調用
processEvents()
,可以讓應用程序保持響應,處理用戶輸入和更新界面。 - 進度更新: 在長時間操作的循環中,您可能希望更新進度條或其他 UI 元素。通過調用
processEvents()
,可以確保這些更新能夠立即反映在用戶界面上。
QObject
和父子關系
QObject
是 Qt 框架中的一個核心類,提供了對象的基本功能,包括信號和槽機制、事件處理等。- 在 Qt 中,父子關系用于管理對象的生命周期。當一個對象(子對象)的父對象被銷毀時,所有其子對象也會被自動銷毀。通過設置
parent
,可以確保內存管理的方便性和安全性。
示例:
HomeWgt::HomeWgt(QWidget *parent) :QWidget(parent),ui(new Ui::HomeWgt)
{bMange= new boxmange(this);sConfig= new SysConfig(this);
}
QTimer
的用法
QTimer
是 Qt 中非常實用的類,用于處理定時任務。通過調用 start()
方法,您可以啟動或重新啟動定時器,讓它在指定的時間間隔內定期發射 timeout()
信號,并執行相應的槽函數。使用 QTimer
可以幫助您輕松管理時間相關的任務,保持應用程序的響應性。
1. QTimer 的基本使用方式
要使用 QTimer
,您通常需要執行以下步驟:
- 創建一個
QTimer
對象。 - 連接定時器的
timeout()
信號到一個槽(slot)函數。 - 調用
start()
方法來啟動定時器。
示例代碼
下面是一個簡單的示例,展示了如何使用 QTimer
:
cpp#include <QApplication>
#include <QWidget>
#include <QTimer>
#include <QLabel>class MyWidget : public QWidget {Q_OBJECTpublic:MyWidget() {label = new QLabel("0", this);label->setAlignment(Qt::AlignCenter);setFixedSize(200, 100);timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MyWidget::updateLabel);timer->start(1000); // 每1000毫秒(1秒)觸發一次timeout信號}private slots:void updateLabel() {count++;label->setText(QString::number(count));}private:QTimer *timer;QLabel *label;int count = 0;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget w;w.show();return app.exec();
}#include "main.moc" // 需要包含這個,以支持信號和槽的實現
2. start() 方法的作用
- 啟動定時器:
start(int msec)
方法用于啟動定時器,msec
參數指定了定時器的時間間隔(以毫秒為單位)。當定時器啟動后,timeout()
信號將每隔指定的時間間隔發射一次。 - 重新啟動定時器: 如果定時器已經在運行,調用
start()
方法會重新啟動定時器,重置計時器的時間間隔。也就是說,定時器會在新的時間間隔開始計時。 - 定時器的精度:
QTimer
的精度通常是毫秒級,但具體的精度可能會受到操作系統和系統負載的影響。
3. 其他相關方法
- stop():
stop()
方法用于停止定時器。如果您希望在某個條件下停止定時器,可以調用此方法。 - isActive():
isActive()
方法可以檢查定時器是否正在運行。如果定時器正在運行,返回true
;否則返回false
。