我看到accept()
有点类似于return
,所以我一直把它放在我的插槽的末尾,之后没有代码。也就是说,accept()
“完成”对话框的执行。
尽管如此,我还是需要关闭一个对话框并从第一个插槽中打开一个新对话框。因此,我认为将accept()
移动到插槽的开头并在其后初始化第二个对话框。类似于以下内容:
void FirstDialog:slotFirstDialog()
{
accept();
// Setup second dialog arguments
// ...
SecondDialog *sd = new SecondDialog();
sd->exec();
}
这种accept()
的使用是否有效?这是好习惯吗?
我会避免它。调用accept()
可以触发延迟删除FirstDialog
(例如,如果它设置了Qt::WA_DeleteOnClose
标志)1;在这种情况下,它将在嵌套事件循环(sd->exec()
)调度的第一个事件之一中被删除,这将导致在已删除的实例的方法中继续执行代码。这只是我头脑中的一个示例问题,我相信其他人都可以找到。
我可能只是在调用exec()
之前隐藏对话框,并在嵌套事件循环结束后调用accept()
。
void FirstDialog:slotFirstDialog()
{
// Setup second dialog arguments
// ...
SecondDialog *sd = new SecondDialog();
hide();
sd->exec();
accept();
// NB are we leaking sd?
}
顺便说说:
SecondDialog *sd = new SecondDialog();
sd->exec();
在这里你在堆上分配一个没有父对象的对话框,所以要么设置Qt::WA_DeleteOnClose
,要么在其代码中显式调用this->deleteLater()
,否则你正在泄漏对话框实例。
笔记:
QWidget::close()
一样,如果设置了done()
标志,Qt::WA_DeleteOnClose
会删除对话框。QDialog::accept
用对话框代码QDialog::done
调用Accepted
。以下是QDialog::done
的样子:
void QDialog::done(int r)
{
Q_D(QDialog);
setResult(r);
hide();
d->close_helper(QWidgetPrivate::CloseNoEvent);
d->resetModalitySetByOpen();
emit finished(r);
if (r == Accepted)
emit accepted();
else if (r == Rejected)
emit rejected();
}
隐藏模态对话框并将结果代码设置为Accepted。
考虑到这一点,我认为这不是一个好的实践问题,而是你的应用程序逻辑需要什么。