qmessage example c++ qt qmessagebox

c++ - example - Cuadro de mensaje Sí/No con QMessageBox



qmessagebox qt5 example (5)

¿Cómo se muestra un cuadro de mensaje con los botones Sí / No en Qt y cómo puedo verificar cuál de ellos se presionó?

Es decir, un cuadro de mensaje que se ve así:


Me falta la traducción llamada tr en las respuestas.

Una de las soluciones más simples, que permite una internacionalización posterior:

if (QMessageBox::Yes == QMessageBox::question(this, tr("title"), tr("Message/Question"))) { // do stuff }

En general, es un buen hábito de Qt poner cadenas de nivel de código dentro de una llamada tr("Your String") .

( QMessagebox como el anterior funciona dentro de cualquier método de QWidget )

EDITAR:

puede usar QMesssageBox fuera de un contexto de QWidget , consulte la respuesta de @ TobySpeight.

Si está incluso fuera de un contexto de QObject , reemplace tr con qApp->translate("context", "String") - necesitará #include <QApplication>


Puede usar el objeto QMessage para crear un cuadro de mensaje y luego agregar botones:

QMessageBox msgBox; msgBox.setWindowTitle("title"); msgBox.setText("Question"); msgBox.setStandardButtons(QMessageBox::Yes); msgBox.addButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); if(msgBox.exec() == QMessageBox::Yes){ // do something }else { // do something else }


QT puede ser tan simple como el de Windows. El código equivalente es

if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec()) { }


QMessageBox incluye métodos estáticos para hacer rápidamente estas preguntas:

#include <QApplication> #include <QMessageBox> int main(int argc, char **argv) { QApplication app{argc, argv}; while (QMessageBox::question(nullptr, qApp->translate("my_app", "Test"), qApp->translate("my_app", "Are you sure you want to quit?"), QMessageBox::Yes|QMessageBox::No) != QMessageBox::Yes) // ask again ; }

Si sus necesidades son más complejas que las previstas por los métodos estáticos, debe construir un nuevo objeto QMessageBox y llamar a su método exec() para mostrarlo en su propio bucle de eventos y obtener el identificador del botón presionado. Por ejemplo, podemos querer hacer que "No" sea la respuesta predeterminada:

#include <QApplication> #include <QMessageBox> int main(int argc, char **argv) { QApplication app{argc, argv}; auto question = new QMessageBox(QMessageBox::Question, qApp->translate("my_app", "Test"), qApp->translate("my_app", "Are you sure you want to quit?"), QMessageBox::Yes|QMessageBox::No, nullptr); question->setDefaultButton(QMessageBox::No); while (question->exec() != QMessageBox::Yes) // ask again ; }


Utilizaría QMessageBox::question para eso.

Ejemplo en la ranura de un widget hipotético:

#include <QApplication> #include <QMessageBox> #include <QDebug> // ... void MyWidget::someSlot() { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, "Test", "Quit?", QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { qDebug() << "Yes was clicked"; QApplication::quit(); } else { qDebug() << "Yes was *not* clicked"; } }

Debería trabajar en Qt 4 y 5, requiere QT += widgets en Qt 5, y CONFIG += console en Win32 para ver qDebug() salida.

Consulte la enumeración StandardButton para obtener una lista de botones que puede usar; la función devuelve el botón al que se hizo clic. Puede establecer un botón predeterminado con un argumento adicional (Qt " elige un valor predeterminado adecuado automáticamente " si no lo hace o especifica QMessageBox::NoButton ).