修改A类以在关闭时发出信号
如果修改A窗口部件是可选的,则向其添加一个信号并覆盖closeEvent
或hideEvent
,然后在那里发出新信号。这是稳健的,并且您完全控制发生的情况。但是,如果由于某种原因您无法或不愿意干扰A并且想在B类中获得解决方案,则其余答案适用。
使用Qt信号进行QObject删除
如果您可以在A
上设置Qt::WA_DeleteOnClose
属性,则简单的方法是将B::doSomething()
(注意常见的Qt方法命名约定)作为槽连接到A实例的destroyed
信号。
B::B(QWidget *parent) : QDialog(parent), ui(new Ui::B)
{
a = new A();
a->setAttribute(Qt::WA_DeleteOnClose);
connect(a, SIGNAL(destroyed(QObject*)), SLOT(doSomething()));
a.show();
}
当然,即使您明确地
delete a;
,而不是通过属性自动删除,这也可以工作。
注意:在这种情况下,当对象可能随时被删除时,您应该真正使用
QPointer
用于
a
指针,以避免意外引用悬空指针。
使用 Qt 事件过滤器
如果您不想在关闭A实例时将其删除(并在需要时重新创建),则另一种方法是在A实例上安装事件过滤器,并检测closeEvent。这可能存在问题,因为小部件可以拒绝关闭事件,在任何情况下都会在关闭之前调用doSomething。如果这是一个问题,可以使用QMetaObject :: invokeMethod静态方法来延迟doSomething的调用(必须是槽或可调用方法!),以便在关闭事件结束并程序返回事件循环后发生。然后在doSomething中检查a是否真的隐藏了。检测QEvent :: Hide而不是QEvent :: Close也可能很好用。
为了实现这个功能,在B类中覆盖虚拟的
eventFilter
方法,例如:
bool B::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Close) {
qDebug("QCloseEvent!");
if (qobject_cast<QObject *>(a) == obj) {
doSomething();
} else {
qDebug("...but the object is not what is expected, a bug?");
}
}
return QObject::eventFilter(obj, event);
}
然后使用installEventFilter开始监听一个A
实例的事件,类似这样:
B::B(QWidget *parent) : QDialog(parent), ui(new Ui::B)
{
a = new A();
installEventFilter(a);
a.show();
}
A
的类型是什么?QWidget还是QDialog? - UmNyobe