使两个QT对话框相互关闭

Making two QT dialogs close each others

本文关键字:对话框 QT 两个      更新时间:2023-10-16

我已经看到了这个问题:QT/C - 关闭一个小部件时关闭两个小部件但是我没有这个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;
}

打开搜索对话框时,结果对话框也将打开,反之亦然。两个对话框的线程也填充了搜索实例中的指针,反之亦然。每个班级都有过度的closeEvent(),因此他们互相关闭。我本来会期望交叉递归后果并崩溃,但显然效果很好。QT Doc States

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吗?

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

启动闭合的对话框将自己的指针设置为其他对话框,将指针复制到另一个指针以临时值,将另一个指针设置为null,并通过临时指针关闭另一个对话框。如果指向另一个对话框的指针已经为null,则意味着其他对话框已启动关闭,因此除了调用基类实现以关闭对话框外,什么也不做。

是不确定的行为吗?否。无证?可能。(没有找到任何应该有效的明确陈述(。意外?可能不会。QT很成熟,尽管并非总是记录在最后一个细节上。我敢打赌,他们每个小部件只允许一个关闭事件。