C++Qt将TabDialog添加到子窗口后,关闭TabDialog时不能把子窗口也关闭,如何解决
时间: 2024-01-09 11:04:14 浏览: 176
可以通过重写 `closeEvent` 事件来实现在关闭 `TabDialog` 时同时关闭子窗口。具体步骤如下:
1. 在子窗口的头文件中定义一个私有成员变量 `QDialog* m_dialog` 用于保存添加的 `TabDialog` 对象。
2. 在子窗口的构造函数中初始化 `m_dialog` 成员变量,并将 `TabDialog` 添加到子窗口中。
3. 重写 `closeEvent` 事件,判断关闭的是 `TabDialog` 还是子窗口,并根据情况关闭相应的窗口。
示例代码如下:
```cpp
class MyWindow : public QMainWindow {
public:
MyWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
// 初始化 m_dialog 成员变量
m_dialog = new QDialog(this);
// 将 TabDialog 添加到子窗口中
QTabWidget* tabWidget = new QTabWidget(m_dialog);
tabWidget->addTab(new QWidget, "Tab1");
tabWidget->addTab(new QWidget, "Tab2");
QVBoxLayout* layout = new QVBoxLayout(m_dialog);
layout->addWidget(tabWidget);
m_dialog->setLayout(layout);
}
protected:
void closeEvent(QCloseEvent* event) override {
if (event->spontaneous() && m_dialog && m_dialog->isVisible()) {
// 如果是关闭 TabDialog,则同时关闭子窗口
m_dialog->close();
QMainWindow::closeEvent(event);
} else {
// 如果是关闭子窗口,则只关闭子窗口
event->ignore();
hide();
}
}
private:
QDialog* m_dialog;
};
```
在上述代码中,我们通过判断 `spontaneous` 属性来确定是用户主动关闭窗口还是程序关闭窗口。这是因为当用户点击窗口的关闭按钮时,事件会被标记为 spontaneous,而当程序调用 `close` 函数时,事件则不是 spontaneous。在这里我们只希望在用户关闭 `TabDialog` 时同时关闭子窗口,因此需要进行判断。
阅读全文