主視窗 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 或智能指針。