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