在繼承自 QWidget(或 QMainWindow)的類別中,重寫 closeEvent(QCloseEvent *event)。此處可直接存取 UI 成員(如 ui->label),無需額外信號/槽。
// MyWidget.h
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
protected:
void closeEvent(QCloseEvent *event) override;
private:
Ui::MyWidget *ui;
};
// MyWidget.cpp
MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) {
ui->setupUi(this);
}
MyWidget::~MyWidget() { delete ui; }
void MyWidget::closeEvent(QCloseEvent *event) {
// 1. 更新標籤文字
ui->label->setText("視窗即將關閉...");
// 2. 若需延遲關閉(如動畫、確認對話框),呼叫 event->ignore()
// 並在稍後手動呼叫 close() 或 qApp->quit()
// event->ignore();
// 3. 正常關閉流程:呼叫 accept() 或直接返回(預設 accept)
event->accept();
}
closeEvent 內直接操作 ui->label 即可,因為它是該類別的成員函式,擁有完整存取權。event->accept():若只呼叫 ignore() 且不後續處理,視窗不會關閉。closeEvent 執行耗時操作:會凍結 GUI,若需清理資源請移至 ~MyWidget() 或使用 QTimer::singleShot(0, ...) 延遲執行。若要在標題列加入自訂按鈕(非原生關閉鈕),可設置 Qt::WindowFlags 隱藏原生標題列,自行繪製標題列並連接 clicked() 信號到 close() 槽,流程相同。