Используйте QMessageBox, чтобы выбрать из списка опций - PullRequest
0 голосов
/ 19 апреля 2011

Я недавно перешел с Java на Qt, и у меня есть вопрос.В JOptionPane вы можете передать массив вариантов, и JOptionPane автоматически создаст поле со списком для выбора пользователем.Возможно ли что-то аналогичное этому в Qt с QMessageBox или другим нативным элементом Qt?

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Вы должны использовать QInputDialog::getItem().Например:

QStringList fruits;
fruits << "Apple" << "Banana" ... ;
QString fruit = QInputDialog::getItem(this, "Select fruit", "Fruit:", fruits);
0 голосов
/ 19 апреля 2011

Вы можете просто прочитать 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);
 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.

Если вам нужны некоторые параметры, известные только во время выполнения, я могу предложитьэто возможное решение.

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