Russian Qt Forum

Qt => Вопросы новичков => Тема начата: SubaroMows от Ноябрь 30, 2011, 18:41



Название: Ожидания нажатия клавишы.
Отправлено: SubaroMows от Ноябрь 30, 2011, 18:41
Доброго время суток.
Встала задача: в методе ожидать, до тех пор пока не нажата клавиша.

К примеру есть форма на которой задают вопросы:
Текст вопроса
Ответ на вопрос.
кнопка которая говорит следующий вопрос и подтверждает текущий.

Есть метод, который возвращает ответ на вопрос.
Код:
QString askQuest() {
//Ждём пока не нажада кнопка далее и только после этого возвращаем в методе значение
   return answer;
}

можно конечно сделать типа
Код:
while (btnClicked <> true);

Но циклы while не есть тон хорошего программирования.

Видел пример с QMessageBox, решающей мою проблему
Код:
    QMessageBox msgBox;
    msgBox.setText(tr("Желаете сохранить сделанные\nвами изменения?"));
    msgBox.setWindowTitle("Закрытие редактора доменов");
    msgBox.setIcon(QMessageBox::Warning);

    QPushButton *btnYes = msgBox.addButton(tr("Да"), QMessageBox::ActionRole);
    QPushButton *btnNo = msgBox.addButton(tr("Нет"), QMessageBox::ActionRole);
    QPushButton *btnCan = msgBox.addButton(tr("Отмена"), QMessageBox::ActionRole);
    msgBox.exec();
    if (msgBox.clickedButton() == btnYes) {
        on_acceptChange_clicked();
        willChange = false;
        return true;
    } else if (msgBox.clickedButton() == btnNo) {
        willChange = false;
        return true;
    } else if (msgBox.clickedButton() == btnCan) {
        return false;
    }
    return false;

типа условие будет выполнятся только в том случае, если нажали кнопку. Посути мне нужно такое же на форме сделать.


Название: Re: Ожидания нажатия клавишы.
Отправлено: kambala от Ноябрь 30, 2011, 18:57
а вынести то, что в твоем методе идет после нажатия на кнопку, в отдельный слот/метод нельзя?


Название: Re: Ожидания нажатия клавишы.
Отправлено: SubaroMows от Ноябрь 30, 2011, 19:40
Никак вообще.
Я вызываю str = askQuest();
В другом методе.


Название: Re: Ожидания нажатия клавишы.
Отправлено: SubaroMows от Ноябрь 30, 2011, 20:18
Элегантное решение:
Код:
    QEventLoop eventLoop;
    connect(this,
            SIGNAL(nextClicked()),
            &eventLoop,
            SLOT(quit()));
    eventLoop.exec();

сигнал nextClicked срабатывает в том случае если клавиша нажата,
следовательно eventLoop.exec(), закрывается, и программа идёт дальше по коду.


Название: Re: Ожидания нажатия клавишы.
Отправлено: Bepec от Декабрь 01, 2011, 07:09
Мда, оригинально, не скажешь. сам бы я в жизни не додумался что так можно сделать.
По сути у тебя и есть цикл бесконечный, так еще и утяжеленный сигналом :)