【问题标题】:Use QMessageBox to choose from a list of options使用 QMessageBox 从选项列表中进行选择
【发布时间】:2011-04-19 01:04:51
【问题描述】:

我刚从 Java 迁移到 Qt,我有一个问题。在 JOptionPane 中,您可以传递一个选项数组,JOptionPane 将自动创建一个组合框供用户选择。在带有 QMessageBox 或其他原生 Qt 元素的 Qt 中是否可能出现类似的情况?

【问题讨论】:

    标签: java qt joptionpane qmessagebox


    【解决方案1】:

    您应该使用QInputDialog::getItem()。例如:

    QStringList fruits;
    fruits << "Apple" << "Banana" ... ;
    QString fruit = QInputDialog::getItem(this, "Select fruit", "Fruit:", fruits);
    

    【讨论】:

      【解决方案2】:

      您可以阅读 QMessageBox reference

      我正在从中复制粘贴代码示例:

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

      此代码创建一个包含三个按钮(保存、放弃、取消)的消息框。保存按钮处于焦点位置。

      您可以在 setStandardButtons 函数中使用按位 OR 运算符组合来自 Standard buttons 的值。

      如果您需要一些仅在运行时知道的选项,我可以提出这个可能的解决方案。

      QMessageBox msgBox;
      
      //set common message box parameters. (informative text, etc)
      
      //iterate through possible options. For each possible option:
      {
        QPushButton *button = msgBox.addButton(myQStringOption, QMessageBox::AcceptRole);
        connect(button, SIGNAL(clicked()), /* response object */, SLOT(/*response slot*/));
      }
      
      msgBox.exec();
      

      我不确定这是最优雅的解决方案,但它应该可以工作。

      如果您不想使用信号和插槽,您可以使用 clickedButton() 方法来确定按下了哪个按钮。

      msgBox.exec();
      
      if ((msgBox.clickedButton())->text() == myQStringOption){
        //doStuff
      }
      

      【讨论】:

      • 我不确定我是否理解您的回答。我所拥有的是一个任意的 QString 列表,我希望用户选择其中一个。这个列表可长可短,直到运行时我才知道它的内容。我阅读了文档并看到了这个示例,但这似乎并没有解决我的问题,因为它只提供了 3 个选项并且它们不是任意的,它们是由 QMessageBox 预定义的。
      • 对不起,我第一次误解你的问题。我可以建议使用 addButton() 函数。我会尽快用简短的例子更新我的答案。
      • 如文档所示可以直接做这个比较:if( msgbox.clickedButton() == button )
      • 我知道这一点。但是在这个任务中,我认为我们对选择了什么选项很感兴趣,并且在某处存储有关已创建按钮的信息是不必要的。别忘了,按钮是动态创建的,我们没有 option1Button、option2Button 和 optionKButton。我们能拥有的最好的就是 QList 。我认为在这种情况下投反对票是不正确的。
      猜你喜欢
      • 2018-12-25
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2011-09-24
      • 2014-04-14
      • 2020-03-21
      相关资源
      最近更新 更多