【问题标题】:How to enable a button on QDialog1 when QDialog2 closesQDialog关闭时如何在QDialog 1上启用按钮
【发布时间】:2017-02-13 20:49:43
【问题描述】:

我有一个名为Dialog1QDialog 有两个按钮btnDialog2btnDialog3

点击btnDialog2btnDialog3 我运行了以下代码:

void Dialog1::on_btnDialog2_clicked()
{
    ui->btnDialog2->setEnabled(false);

    d2 = new AltDialog(this);
    d2->setWindowTitle("Dialog 2");
    d2->show();
}

void StockItems::on_btnDialog3_clicked()
{
    ui->btnDialog3->setEnabled(false);

    d3= new AltDialog(this);
    d3->setWindowTitle("Dialog 3");
    d3->show();
}

正如预期的那样,如果dialog2dialog3被打开,它们各自的按钮dialog1将被禁用。

我想在它们各自的对话框关闭时重新启用dialog1 上的按钮。

注意:

主对话框有以下两个私有变量来表示每个对话框:

AltDialog *d2, *d3;

对实现我的目标的任何帮助将不胜感激!

【问题讨论】:

  • 简单解决方案:使用QDialog::exec() 而不是QDialog::show()。复杂的解决方案:使用QDialog::accepted()QDialog::rejected() 信号。
  • finished(),或done()。正如@VioletGiraffe 指出的那样,不要使用QDialog::show(),因为它会破坏所有提到的信号的发射,这些信号只有在对话框关闭时才会触发。隐藏不等于关闭。
  • 相反,不要使用QDialog::exec(),因为事件循环的重入会产生伪同步代码,浪费堆栈等,不需要它。一定要使用QDialog::show(),信号会正常发出。
  • showexec 我不在乎,只要我能解决这个问题。
  • @KubaOber:由于exec(),您有多少次堆栈溢出?另一方面,必须show 意味着必须保留实例,浪费内存。我推荐exec() 作为一种更有效的方法,可以生成更清晰的代码,更易于阅读和理解。是的,当然要注意事件循环的含义。

标签: qt qdialog isenabled


【解决方案1】:

如果关闭,您的应用程序需要从特定对话框中获得通知。

您可以在 主对话框 中创建新插槽,以接收来自 d2d3 对话框的信号;并连接,例如,void QDialog::finished(int result) 信号被新创建的插槽捕获:

d2 = new AltDialog(this);
connect(d2, &QDialog::finished, this, &YourMainDialog::d2Finished);
d2->setWindowTitle("Dialog 2");

...

void YourMainDialog::d2Finished(int result)
{
  ui->btnDialog2->setEnabled(true);
}

附:您需要注意finished 信号“在对话框的结果代码被设置时发出,无论是由用户还是通过调用 done()、accept() 或 reject()。” 此外,您在每次按下按钮时都创建新的 AltDialog 对象看起来也不正确。似乎应该将它与信号连接一起移至 Main Dialog 的“初始化”方法。

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多