accept()只能在插槽的末尾使用吗?

问题描述 投票:1回答:2

我看到accept()有点类似于return,所以我一直把它放在我的插槽的末尾,之后没有代码。也就是说,accept()“完成”对话框的执行。

尽管如此,我还是需要关闭一个对话框并从第一个插槽中打开一个新对话框。因此,我认为将accept()移动到插槽的开头并在其后初始化第二个对话框。类似于以下内容:

void FirstDialog:slotFirstDialog()
{
  accept();
  // Setup second dialog arguments
  // ...
  SecondDialog *sd = new SecondDialog();
  sd->exec();
}

这种accept()的使用是否有效?这是好习惯吗?

qt
2个回答
2
投票

我会避免它。调用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(),否则你正在泄漏对话框实例。


笔记:

  1. 它明确地被评论in the documentationQWidget::close()一样,如果设置了done()标志,Qt::WA_DeleteOnClose会删除对话框。

0
投票

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();
}

根据documentation

隐藏模态对话框并将结果代码设置为Accepted。

考虑到这一点,我认为这不是一个好的实践问题,而是你的应用程序逻辑需要什么。

© www.soinside.com 2019 - 2024. All rights reserved.