如何将QMessageBox按钮绑定到操作

时间:2014-04-15 12:49:13

标签: c++ qt

我使用保存,放弃和取消按钮创建了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);

现在,如何将每个按钮绑定到特定命令?

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

好的,有两种方法可以实现这一目标。您可以使用exec(),也可以将show()与信息框的buttonClicked()信号一起使用。

这取决于您的用例exec()是阻止调用。如果您不希望阻止主应用程序线程,可以使用msgBox.show()并使用buttonClicked()函数将此消息框的connect()信号绑定到自定义插槽。

如果exec()其返回代码将告诉您按下了哪个按钮。

答案 2 :(得分:0)

你的实施是什么?您的案例似乎可以调用static method

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(...){
    ...
}

答案 3 :(得分:0)

QMessageBox :: exec()返回用户的选择。

int val = msgBox.exec(); // val is now one of QMessageBox::Save, Discard or Cancel

答案 4 :(得分:0)

为什么需要这样的绑定?您唯一需要知道的是按下消息框的哪个按钮来关闭它。您可以从QMessageBox::exec()函数的返回值获取它。

另一方面,您可以获取添加到消息框中的所有按钮的列表,并使用它们建立信号/插槽连接:

QList<QAbstractButton *> buttons = msgBox->buttons();
foreach (QAbstractButton *btn, buttons) {
    connect(btn, SIGNAL(clicked()), this, SLOT(onBtnClicked()));
}