《C++ GUI Programming with Qt 4》原書以電子表格為貫穿範例,但程式碼分散各章、不易即時驗證成果。本系列採「單章單功能、即寫即跑」模式,本篇實作一個尋找對話框,涵蓋 QDialog、QAction、訊號/槽、前向宣告等核心概念。
一個含「查找內容」輸入框、「大小寫敏感」「向後搜尋」核取方塊、「查找」「關閉」按鈕的標準對話框。
FindDialogFindDialog,取消 Generate form(純手刻程式碼)finddialog.h 完整解析#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QtGui/QDialog>
// 前向宣告:僅使用指標,無需引入完整定義,加快編譯
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class FindDialog : public QDialog
{
Q_OBJECT // 必須:啟用訊號/槽機制的 MOC 處理
public:
explicit FindDialog(QWidget *parent = 0);
~FindDialog();
signals: // 對外發射的訊號
void findNext(const QString &str, Qt::CaseSensitivity cs);
void findPrevious(const QString &str, Qt::CaseSensitivity cs);
private slots: // 內部處理的槽函式
void findClicked();
void enableFindButton(const QString &text);
private: // UI 元件指標
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
};
#endif // FINDDIALOG_H
| 語法 | 用途 | 備註 |
|---|---|---|
Q_OBJECT | 啟用 Qt 元物件系統 | 含訊號/槽、屬性、執行時型別資訊的類別必加 |
| 前向宣告 | 僅宣告類別存在 | 減少標頭檔相依、加速編譯;.cpp 再 #include 完整定義 |
signals: | 定義可發射的訊號 | 本質是 protected 虛函式,由 MOC 實作 |
slots: | 定義可接收訊號的槽 | 可為 public/protected/private |
Qt::CaseSensitivity | 大小寫敏感度列舉 | Qt::CaseSensitive / Qt::CaseInsensitive |
下篇將完成 finddialog.cpp:建立 UI 佈局、連接訊號槽、實作 findClicked() 與 enableFindButton() 邏輯,並撰寫 main.cpp 啟動對話框。敬請期待!
本文整理自「豆子空間」博客,原文出處:https://devbean.blog.51cto.com/448512/198971