在qmainwindow中使用mdiArea->installEventFilter(this);而在mdiarea控件中的子窗口qwidget关闭时 自定义树模型 parent()程序报错 如何拦截子窗口关闭事件
时间: 2023-12-06 11:45:00 浏览: 72
如何在父窗口中得知window.open()出的子窗口关闭事件
可以在子窗口的关闭事件中发送自定义信号,然后在主窗口中使用connect连接这个信号,并在槽函数中处理关闭事件。具体实现如下:
首先,在子窗口类中声明一个信号:
```cpp
class MyChildWindow : public QWidget
{
Q_OBJECT
signals:
void childWindowClosed(MyChildWindow *childWindow);
protected:
void closeEvent(QCloseEvent *event) override;
};
```
然后在子窗口的关闭事件中发送这个信号:
```cpp
void MyChildWindow::closeEvent(QCloseEvent *event)
{
emit childWindowClosed(this);
event->accept();
}
```
在主窗口的构造函数中连接子窗口的信号和槽:
```cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// ...
connect(mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::updateActions);
// connect child window closed signal to slot
connect(mdiArea, &QMdiArea::subWindowActivated, this, [=](QMdiSubWindow *window){
MyChildWindow *childWindow = qobject_cast<MyChildWindow*>(window->widget());
if (childWindow) {
connect(childWindow, &MyChildWindow::childWindowClosed, this, &MainWindow::onChildWindowClosed);
}
});
}
void MainWindow::onChildWindowClosed(MyChildWindow *childWindow)
{
// handle child window closed event
// ...
// disconnect child window closed signal from slot
disconnect(childWindow, &MyChildWindow::childWindowClosed, this, &MainWindow::onChildWindowClosed);
}
```
这样,当子窗口关闭时,会发送childWindowClosed信号,主窗口中的onChildWindowClosed槽函数会接收到这个信号,并在其中处理关闭事件。同时,在处理完成后,需要将子窗口的信号和槽断开连接,避免重复连接导致的问题。
阅读全文