Qt 不同於傳統輪詢/線程模型,其核心是 **事件循環** 與 **信號槽機制**。應用程序進入 QCoreApplication::exec() 後,主線程持續從事件隊列取出事件分發給對象處理;對象間通過 emit signal 觸發連接的槽函數,實現**鬆耦合、類型安全**的通信。
# Ubuntu/Debian
sudo apt update && sudo apt install qtbase5-dev qtcreator qt5-qmake g++ cmake
# 或安裝 Qt 6
sudo apt install qt6-base-dev qt6-tools-dev
# 經典 qmake .pro 文件
QT += core gui widgets network sql
CONFIG += c++17
SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
RESOURCES += resources.qrc
.ui XML 文件。// 新語法 (Qt 5+,編譯期檢查類型安全)
connect(ui->btnLogin, &QPushButton::clicked, this, &MainWindow::onLoginClicked);
connect(socket, &QTcpSocket::readyRead, this, &MainWindow::onDataReceived);
connect(worker, &Worker::progressUpdated, ui->progressBar, &QProgressBar::setValue);
// Lambda 槽 (簡單邏輯)
connect(btn, &QPushButton::clicked, [this](){ statusLabel->setText("Clicked!"); });
// 鍵盤事件
void MainWindow::keyPressEvent(QKeyEvent *event) {
if (event->key() == Qt::Key_Escape) close();
else QMainWindow::keyPressEvent(event);
}
// 關閉事件 (攔截關閉)
void MainWindow::closeEvent(QCloseEvent *event) {
if (maybeSave()) event->accept();
else event->ignore();
}
// 自定義事件
void MyWidget::customEvent(QEvent *event) {
if (event->type() == MyEventType) { /* ... */ }
}
// Worker 對象移動到線程 (推薦模式)
Worker *worker = new Worker();
QThread *thread = new QThread(this);
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::finished, thread, &QThread::quit);
connect(worker, &Worker::finished, worker, &Worker::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();
// QtConcurrent 簡單任務
auto future = QtConcurrent::run([](){ return heavyCalculation(); });
QFutureWatcher *watcher = new QFutureWatcher(this);
connect(watcher, &QFutureWatcher::finished, [this, watcher](){
qDebug() << "Result:" << watcher->result();
});
watcher->setFuture(future);
# 命令行構建
qmake && make -j$(nproc)
# 或 CMake
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build --parallel
# 部署依賴收集 (linuxdeployqt / CMake install)
linuxdeployqt build/MyApp -appimage
| 領域 | Linux/Qt 具體點 |
|---|---|
| 窗口系統 | X11 (傳統) / Wayland (現代)。Qt 通過 QPA (Qt Platform Abstraction) 適配,環境變量 QT_QPA_PLATFORM=wayland|xcb 強制指定。 |
| 字體渲染 | 依賴 Fontconfig + FreeType。部署時需打包字體或確保目標系統有字體。 |
| 輸入法 | fcitx/ibus 集成 via Qt 輸入法模塊 (qt5-gtk-platformtheme 等)。 |
| 系統托盤 | 需支持 StatusNotifierItem (KDE) 或 Ayatana (GNOME/Ubuntu),QSystemTrayIcon 自動適配。 |
| 打包分發 | AppImage (推薦)、Flatpak、Snap、原生 .deb/.rpm。linuxdeployqt 自動收集 .so 依賴生成 AppImage。 |
| 調試 | Qt Creator + GDB/LLDB 完美支持。qDebug() << Qt::endl; 輸出到應用程序輸出面板。 |
Linux 下 Qt 開發:**Qt Creator 一站式 IDE + qmake/CMake 構建 + 信號槽驅動業務 + QThread/QtConcurrent 多線程 + linuxdeployqt 打包 AppImage**。掌握「事件循環」與「對象樹內存管理」兩大核心機制,即可舉一反三,高效構建跨平台桌面/嵌入式應用。