首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Qt 主視窗與子視窗通信詳解:直接調用與信號槽兩大模式實戰

     編輯:程式設計綜合問答

場景

主視窗 MainWindow 需打開子視窗 Dialog,子視窗關閉後主視窗獲取數據或響應事件。

模式一:模態執行 + 直接調用(簡單同步)

// MainWindow.cpp
void MainWindow::onOpenDialog() {
    Dialog dlg(this);
    if (dlg.exec() == QDialog::Accepted) {  // 阻塞直到關閉
        QString data = dlg.getData();       // 直接調用公有方法取值
        // 使用 data...
    }
}

// Dialog.h
public:
    QString getData() const { return m_data; }
private:
    QString m_data;

適用於簡單數據回傳,代碼直觀,無異步複雜度。

模式二:信號與槽(解耦、異步友好)

// Dialog.h
signals:
    void dataReady(const QString &data);

// Dialog.cpp 內部某處(如按鈕點擊)
emit dataReady(m_data);

// MainWindow.cpp
void MainWindow::onOpenDialog() {
    Dialog *dlg = new Dialog(this);
    connect(dlg, &Dialog::dataReady, this, &MainWindow::onDataReady);
    dlg->setAttribute(Qt::WA_DeleteOnClose); // 關閉自動刪除
    dlg->show(); // 非模態
}

void MainWindow::onDataReady(const QString &data) {
    // 處理數據
}

適用於非模態、多對多、跨線程通信,符合 Qt 核心設計哲學。

進階提示

  • 跨線程傳遞數據時,信號槽連接類型指定為 Qt::QueuedConnection 或使用 QMetaObject::invokeMethod。
  • 大數據傳遞建議使用隱式共享類(QString、QByteArray、QVariant)避免深拷貝開銷。
  • 子視窗生命週期管理:模態用棧對象,非模態用堆對象 + WA_DeleteOnClose 或智能指針。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved