使两个QT对话框彼此关闭

时间:2018-02-22 14:35:54

标签: c++ qt

我见过这个问题:Qt/C++ - Closing two widgets when one is closed 但是,我没有这个MainWindow< - >小部件关系。

class Ui_DialogResults
{
public:
    QDialog *_Dialog;
    void setupUi(QDialog *Dialog)
    {
_Dialog = Dialog;
    }
};
class Ui_DialogSearch
{
public:
    QDialog *_Dialog;
    void setupUi(QDialog *Dialog)
    {
_Dialog = Dialog;
    }
};
namespace Ui {
    class Ui_Search : public Ui_DialogSearch {};
    class Ui_Results : public Ui_DialogResults {};
}
class Search : public QDialog{
public:
Search(){
ui.setup(this);
}
    void closeEvent(QCloseEvent *event)
    {
        //saves scan settings here
        pResults->_Dialog->close();
    }
Ui::Ui_Search ui;
Ui::Ui_Results *pResults;
}
class Results : public QDialog{
public:
Results(){
ui.setup(this);
}
    void closeEvent(QCloseEvent *event)
    {
        //saves scan settings here
        pSearch->_Dialog->close();
    }
Ui::Ui_Search *pSearch;
Ui::Ui_Results ui;
}

当“搜索”对话框打开时,结果对话框也会打开,反之亦然。 线程打开两个对话框也会将搜索实例中的指针填充到Result,反之亦然。 每个类都覆盖closeEvent(),以便它们彼此关闭。 我本来期望交叉递归后果和崩溃,但它显然是完美的。 Qt doc陈述

The QCloseEvent class contains parameters that describe a close event.

Close events are sent to widgets that the user wants to close, usually by choosing "Close" from the window menu, or by clicking the X title bar button. They are also sent when you call QWidget::close() to close a widget programmatically.

这是UB吗?

2 个答案:

答案 0 :(得分:1)

由于您已经在搜索和结果对话框之间存在相互引用,因此您可以通过将指针设置为null并执行一些基本检查来轻松避免任何潜在事件。

启动关闭的对话框在另一个对话框中将其自己的指针设置为null,将指向另一个的指针复制到临时值,将另一个指针设置为null并通过临时指针关闭另一个对话框。如果指向另一个对话框的指针已经为空,那意味着另一个对话框已经启动了结束,所以除了调用基类实现以关闭对话框之外什么都不做。

答案 1 :(得分:-1)

是不确定的行为?没有记载?有可能。 (没有发现任何明确的声明,这应该工作)。意外?可能不是。 Qt非常成熟,但并不总是记录在最后的细节上。我敢打赌他们每个小部件只允许一个关闭事件。