如何将QMessageBox按钮绑定到操作

3
我创建了一个带有保存、放弃和取消按钮的 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个回答

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

2
对于异步/非阻塞使用情况,也可以指向open()和finished(int)信号。 - Frank Osterfeld

1
为什么需要这样的绑定?你唯一需要知道的是哪个消息框按钮被按下以关闭它。你可以通过 QMessageBox::exec() 函数的返回值来获取它。
另一方面,你可以获取添加到消息框中的所有按钮列表,并使用它们来建立信号/槽连接:
QList<QAbstractButton *> buttons = msgBox->buttons();
foreach (QAbstractButton *btn, buttons) {
    connect(btn, SIGNAL(clicked()), this, SLOT(onBtnClicked()));
}

1

好的,有两种方法可以实现这个。你可以使用exec()或者你可以使用带有消息框buttonClicked()信号的show()

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

如果使用exec(),它的返回值将告诉你按下了哪个按钮。


0

你的实现是什么?你的情况看起来可以直接调用静态方法

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

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接