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





qt5 example (6)


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()) 
{

}

¿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í:




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
}



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



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>




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




Es porque la CPU no tiene tantos fallos de caché (donde tiene que esperar a que los datos de la matriz provengan de los chips de RAM). Sería interesante para usted ajustar el tamaño de las matrices continuamente para que exceda los tamaños de la caché de nivel 1 (L1), y luego la caché de nivel 2 (L2) de su CPU y trace el tiempo necesario para su código para ejecutar contra los tamaños de las matrices. La gráfica no debería ser una línea recta como cabría esperar.





c++ qt qmessagebox