Respuestas:
Lo usarías 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 funcionar en Qt 4 y 5, requiere QT += widgets
en Qt 5 y CONFIG += console
en Win32 para ver la qDebug()
salida.
Consulte la StandardButton
enumeración para obtener una lista de botones que puede usar; la función devuelve el botón en el que se hizo clic. Puede establecer un botón predeterminado con un argumento adicional (Qt " elige automáticamente un botón predeterminado adecuado " si no lo especifica QMessageBox::NoButton
).
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
}
setIcon
método como parte del QMessageBox
objeto. con uno si estas enumeraciones como parámetros: QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
Me falta la llamada de traducción tr
en las respuestas.
Una de las soluciones más sencillas, que permite una posterior internacionalización:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
En general, es un buen Qt
hábito colocar cadenas a nivel de código dentro de una tr("Your String")
llamada.
( QMessagebox
como arriba funciona dentro de cualquier QWidget
método)
EDITAR:
puede usar QMesssageBox
fuera de un QWidget
contexto, consulte la respuesta de @ TobySpeight.
Incluso si está fuera de un QObject
contexto, reemplace tr
con qApp->translate("context", "String")
- necesitará#include <QApplication>
QMessageBox
incluye métodos estáticos para hacer rápidamente tales 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 QMessageBox
objeto y llamar a su exec()
método para mostrarlo en su propio bucle de eventos y obtener el identificador del botón presionado. Por ejemplo, podríamos querer 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
;
}
QApplication
, sugiero usar qApp->translate("context", "String")
, que reemplaza tr
para el uso fuera de una QObject
clase
Si desea hacerlo en Python, debe verificar este código en su banco de trabajo. también escribe así. Creamos un cuadro emergente con Python.
msgBox = QMessageBox()
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)
ret = msgBox.exec_()