我见过这个问题: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吗?
答案 0 :(得分:1)
由于您已经在搜索和结果对话框之间存在相互引用,因此您可以通过将指针设置为null并执行一些基本检查来轻松避免任何潜在事件。
启动关闭的对话框在另一个对话框中将其自己的指针设置为null,将指向另一个的指针复制到临时值,将另一个指针设置为null并通过临时指针关闭另一个对话框。如果指向另一个对话框的指针已经为空,那意味着另一个对话框已经启动了结束,所以除了调用基类实现以关闭对话框之外什么都不做。
答案 1 :(得分:-1)
是不确定的行为?没有记载?有可能。 (没有发现任何明确的声明,这应该工作)。意外?可能不是。 Qt非常成熟,但并不总是记录在最后的细节上。我敢打赌他们每个小部件只允许一个关闭事件。