QDialog exec () и получение значения результата

Я подкласс QDialog реализовать функциональность, аналогичную QMessageBox (Мне нужно было это для настройки). Он имеет текстовое сообщение и ОК, кнопки Отмена. Я показываю диалог используя exec() сделать это блокирующим. Теперь, как мне вернуть значения true / false, когда пользователь нажимает OK / Cancel?

Я пытался подключить кнопки к setResult() а затем вернуть значение результата при нажатии, но
1. Нажатие кнопки не закрывает диалоговое окно
2. возвращаемое значение неверно.
Ниже приведен код, который я написал. Я думаю, что я не прав в части exec / result — но я не уверен, как это исправить.

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

};

Пользователь создаст экземпляр класса и вызовет showYourself (), который, как ожидается, вернет значение, а также закроет (и удалит) диалоговое окно.

Я разместил частичный код. Дайте мне знать, если вам нужно больше, и я опубликую полную версию.

21

Решение

Некоторые моменты:

  1. Вместо того, чтобы использовать setResult() себя использовать QDialog :: принимает () а также QDialog :: отклонять ().
  2. Кажется, вы не в полной мере используете сигналы и слоты. Вам нужен объект, который создает диалог (или другой) для прослушивания сигналов диалога.
  3. В вашем коде вы также не подключаете сигналы к слотам.
  4. С моим исправлением onOKButtonClicked а также onCancelButtonClicked не нужны.
  5. С моим исправлением тебе не нужно showYourself(), Просто позвони exec и с событиями
    информация будет течь.

Вам нужно добавить этот код перед отображением диалогового окна (this предположим, что это в методе диалога):

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

В вызывающем объекте у вас есть

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

Другие решения

Другое решение:

    // 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 }
17

Случай 1 Нажатие на кнопки не закрывает диалоговое окно.

Для этого вам необходимо закрыть диалоговое окно SLOTSТак что используйте

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

Примечание. Только после нажатия кнопки «ОК» или «Отмена» в стандартном QMessageBox запускается функция setResult () и изменяется статус. Это не тот же эффект, когда сделано наоборот.

Дело 2 Возвращаемое значение неверно.

Я думаю, что только после того, как ваш диалог будет закрыт, вы получите результат в result() функция. Поэтому я думаю, что это будет решено после того, как вы внесли изменения, указанные в первом случае.

Если это все еще сохраняется, используйте вашу собственную функцию члена, чтобы решить это.

8
По вопросам рекламы [email protected]