c++ - QDialog exec() y obteniendo valor de resultado
qt (3)
Algunos puntos :
- En lugar de utilizar
setResult()
, use QDialog::accept() y QDialog::reject() . - 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.
- En tu código tampoco estás conectando señales a las ranuras.
- Con mi corrección,
onOKButtonClicked
yonCancelButtonClicked
son innecesarios. - Con mi arreglo no necesitas
showYourself()
. Simplemente llame aexec
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.