如何将 QMessageBox 按钮绑定到操作

How to bind QMessageBox button to action

提问人:user3204810 提问时间:4/15/2014 最后编辑:Shoeuser3204810 更新时间:4/10/2019 访问量:5679

问:

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

现在,如何将这些按钮中的每一个绑定到特定命令?

C++ QT系列

评论


答:

0赞 Bowdzone 4/15/2014 #1

你们的实施方式是什么?您的案例看起来可以调用静态方法

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赞 tpatja 4/15/2014 #2

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

int val = msgBox.exec(); // val is now one of QMessageBox::Save, Discard or Cancel
8赞 Liviu Gheorghisan 4/15/2014 #3
 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赞 Frank Osterfeld 4/16/2014
对于异步/非阻塞用例,可能也值得指出 open() 和 finished(int) 信号。
1赞 vahancho 4/15/2014 #4

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

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

QList<QAbstractButton *> buttons = msgBox->buttons();
foreach (QAbstractButton *btn, buttons) {
    connect(btn, SIGNAL(clicked()), this, SLOT(onBtnClicked()));
}
1赞 Abhishek Bansal 4/15/2014 #5

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

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

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