Respostas:
Você usaria QMessageBox::question
para isso.
Exemplo em um slot de 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";
}
}
Deve funcionar no Qt 4 e 5, requer QT += widgets
no Qt 5 e CONFIG += console
no Win32 para ver a qDebug()
saída.
Consulte o StandardButton
enum para obter uma lista de botões que você pode usar; a função retorna o botão que foi clicado. Você pode definir um botão padrão com um argumento extra (Qt " escolhe um padrão adequado automaticamente " se você não escolher ou especificar QMessageBox::NoButton
).
Você pode usar o objeto QMessage para criar uma caixa de mensagem e adicionar botões:
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
parte do método do QMessageBox
objeto. com um destes enums como parâmetros: QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
Estou perdendo a chamada de tradução tr
nas respostas.
Uma das soluções mais simples, que permite uma posterior internacionalização:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
Geralmente, é um bom Qt
hábito colocar Strings de nível de código em uma tr("Your String")
chamada.
( QMessagebox
como acima funciona em qualquer QWidget
método)
EDITAR:
você pode usar QMesssageBox
fora de um QWidget
contexto, consulte a resposta de @TobySpeight.
Se você estiver fora de um QObject
contexto, substitua tr
por qApp->translate("context", "String")
- você precisará#include <QApplication>
QMessageBox
inclui métodos estáticos para fazer rapidamente essas perguntas:
#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
;
}
Se suas necessidades são mais complexas do que as fornecidas pelos métodos estáticos, você deve construir um novo QMessageBox
objeto e chamar seu exec()
método para mostrá-lo em seu próprio loop de eventos e obter o identificador do botão pressionado. Por exemplo, podemos querer que "Não" seja a resposta padrão:
#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
, sugiro usar qApp->translate("context", "String")
, que substitui tr
o uso fora de uma QObject
classe
Se você quiser fazer em python, você precisa verificar este código em seu ambiente de trabalho. também escreva assim. criamos uma caixa pop-up com 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_()