我创建了一个带有保存、放弃和取消按钮的QMessageBox
:
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.setInformativeText("Do you want to save your changes?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
msgBox.setIcon(QMessageBox::Question);
现在,我如何将这些按钮中的每一个绑定到特定的命令?
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.setInformativeText("Do you want to save your changes?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
// Save was clicked
break;
case QMessageBox::Discard:
// Don't Save was clicked
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
为什么需要这样的绑定?你只需要知道是按下了消息框的哪个按钮就可以关闭它。你可以从QMessageBox::exec()
函数的返回值中获得它。
另一方面,您可以获得添加到消息框中的所有按钮的列表,并使用它们来建立信号/插槽连接:
QList<QAbstractButton *> buttons = msgBox->buttons();
foreach (QAbstractButton *btn, buttons) {
connect(btn, SIGNAL(clicked()), this, SLOT(onBtnClicked()));
}
好的,有两种方法可以实现这一点。您可以使用exec()
,也可以将show()
与消息框的buttonClicked()
信号一起使用。
这取决于您的用例exec()
是一个阻塞调用。如果您不希望您的主应用程序线程被阻止,您可以使用msgBox.show()
,并使用connect()
功能将此消息框的buttonClicked()
信号绑定到您的自定义插槽。
如果是exec()
,它的返回代码会告诉你按下了哪个按钮。
您的实现是什么?您的案例看起来可以直接调用静态方法
QMessageBox::StandardButton b = QMessageBox::question(QWidget* parent, "The document has been modified.", "Do you want to save your changes?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);
if(b == QMessageBox::Save){
...
}else if(...){
...
}
QMessageBox::exec()返回用户的选择。
int val = msgBox.exec(); // val is now one of QMessageBox::Save, Discard or Cancel