c++ qt qdialog

c++ - QDialog exec() y obteniendo valor de resultado



qt (3)

Algunos puntos :

  1. En lugar de utilizar setResult() , use QDialog::accept() y QDialog::reject() .
  2. Parece que no estás aprovechando al máximo las señales y las ranuras. Necesita el objeto que crea el diálogo (u otro) para escuchar las señales del diálogo.
  3. En tu código tampoco estás conectando señales a las ranuras.
  4. Con mi corrección, onOKButtonClicked y onCancelButtonClicked son innecesarios.
  5. Con mi arreglo no necesitas showYourself() . Simplemente llame a exec y con la información de eventos fluirá.

Debe agregar este código antes de mostrar el cuadro de diálogo ( this supone que está en un método de diálogo):

QObject::connect(acceptButton, SIGNAL(clicked()), this, SLOT(accept())); QObject::connect(rejectButton, SIGNAL(clicked()), this, SLOT(reject()));

En el objeto que llamas tienes

void someInitFunctionOrConstructor(){ QObject::connect(mydialog, SIGNAL(finished (int)), this, SLOT(dialogIsFinished(int))); } void dialogIsFinished(int){ //this is a slot if(result == QDialog::Accepted){ //do something return } //do another thing }

He subclasificado QDialog para implementar una funcionalidad similar a QMessageBox (necesitaba esto para permitir la personalización). Tiene un mensaje de texto y botones Aceptar, Cancelar. Estoy mostrando el diálogo usando exec() para hacer que se bloquee. Ahora, ¿cómo devuelvo valores de verdadero / falso cuando el usuario hace clic en Aceptar / Cancelar?

Intenté conectar los botones para setResult() y luego, devolver el valor del resultado al hacer clic, pero 1. Al hacer clic en los botones no se cierra el cuadro de diálogo 2. el valor de retorno es incorrecto. A continuación se muestra el código que he escrito. Creo que estoy equivocado en la parte ejecutiva / resultado, pero no estoy seguro de cómo solucionarlo.

class MyMessageBox : public QDialog { Q_OBJECT private slots: void onOKButtonClicked(){ this->setResult(QDialog::Accepted);} void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);} public: MyMessageBox(QMessageBox::Icon icon, const QString & title, const QString & text, bool showCancelButton = true, QWidget *parent = 0 ); virtual void resizeEvent(QResizeEvent* e); QDialog::DialogCode showYourself() { this->setWindowModality(Qt::ApplicationModal); this->exec(); return static_cast<QDialog::DialogCode>(this->result()); } };

El usuario creará una instancia de la clase y llamará a showYourself (), que se espera que devuelva el valor y también cierre (y elimine) el cuadro de diálogo.

He publicado código parcial. Déjame saber si necesitas más y publicaré la versión completa.


Otra solución:

// set signal and slot for "Buttons" connect(YesButton, SIGNAL(clicked()), dlg, SLOT(accept())); connect(NoButton, SIGNAL(clicked()), dlg, SLOT(reject())); // show modal window event loop and wait for button clicks int dialogCode = dlg->exec(); // act on dialog return code if(dialogCode == QDialog::Accepted) { // YesButton clicked } if(dialogCode == QDialog::Rejected) { // NoButton clicked }


Caso 1 Al hacer clic en los botones no se cierra el cuadro de diálogo.

Para ello, tiene que cerrar el cuadro de diálogo en SLOTS respectivas, así que Use

void onOKButtonClicked(){ this->setResult(QDialog::Accepted); this->close();} void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);this->close();}

Nota: Solo después de haber hecho clic en el botón Aceptar o en el botón Cancelar en un QMessageBox estándar, se activa la función setResult () y se cambia el estado. No es el mismo efecto cuando se hace al revés.

Caso 2 El valor de retorno es incorrecto.

Creo que solo después de que su diálogo se cierre, tendrá el resultado disponible en la función result() . Así que supongo que se resolverá, una vez que haya realizado los cambios especificados en el Caso 1.

Si aún persiste, use su propia función de miembro privado para resolverla.