【发布时间】:2017-02-13 20:49:43
【问题描述】:
我有一个名为Dialog1 的QDialog 有两个按钮btnDialog2 和btnDialog3。
点击btnDialog2 和btnDialog3 我运行了以下代码:
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();
}
正如预期的那样,如果dialog2或dialog3被打开,它们各自的按钮dialog1将被禁用。
我想在它们各自的对话框关闭时重新启用dialog1 上的按钮。
注意:
主对话框有以下两个私有变量来表示每个对话框:
AltDialog *d2, *d3;
对实现我的目标的任何帮助将不胜感激!
【问题讨论】:
-
简单解决方案:使用
QDialog::exec()而不是QDialog::show()。复杂的解决方案:使用QDialog::accepted()和QDialog::rejected()信号。 -
或
finished(),或done()。正如@VioletGiraffe 指出的那样,不要使用QDialog::show(),因为它会破坏所有提到的信号的发射,这些信号只有在对话框关闭时才会触发。隐藏不等于关闭。 -
相反,不要使用
QDialog::exec(),因为事件循环的重入会产生伪同步代码,浪费堆栈等,不需要它。一定要使用QDialog::show(),信号会正常发出。 -
show或exec我不在乎,只要我能解决这个问题。 -
@KubaOber:由于
exec(),您有多少次堆栈溢出?另一方面,必须show意味着必须保留实例,浪费内存。我推荐exec()作为一种更有效的方法,可以生成更清晰的代码,更易于阅读和理解。是的,当然要注意事件循环的含义。