QT сделать пока цикл - PullRequest
0 голосов
/ 18 апреля 2011

Я изучаю QT в эти дни, и я хотел протестировать цикл do while, фактический вход в систему работает нормально, но в QT приложение зависает. Я определил randnum и угадаю в заголовочном файле (общедоступном)

void MainWindow::on_pushButton_clicked()
{
    srand (time(NULL));
    randnum = rand() % 10 +1;
    do {
    guess = ui->spinBox->value();
    if (guess < randnum)
    {
    ui->label->setText("try something big");
    }
    else if (guess > randnum)
    {
    ui->label->setText("try something small");
    }
    else
        ui->label->setText("YAY?");

    } while (guess != randnum);
}

подскажите, пожалуйста, как найти причину, по которой он зависает .. спасибо!

Ответы [ 4 ]

7 голосов
/ 18 апреля 2011

Ваше приложение зависает, потому что вы зацикливаетесь и не позволяете Qt выполнять необходимую обработку.

Вам нужно настроить случайное предположение в конструкторе класса, а затем включить при вызове on_pushButton_clicked вам нужно просто выполнить проверки if. т.е. удалить цикл do while.

Код выйдет из функции обратного вызова, а затем управление вернется к Qt, позволяя пользователю сделать еще одно предположение.

1 голос
/ 18 апреля 2011

Я не эксперт по QT, но если значение spinbox неверно, вы будете бесконечно выполнять цикл в этой функции, и у пользователя не будет возможности снова щелкнуть спинбокс. Просто удалите цикл и установите randnum где-нибудь в конструкторе класса, тогда все должно быть хорошо.

Цикл событий QT позаботится о том, чтобы ваша программа работала, вам не нужно это делать.

0 голосов
/ 18 апреля 2011

Скажите Qt обрабатывать события, вызывая QCoreApplication :: processEvents (), если пользователь не выбрал правильное число.

Лучшим решением было бы сделать то, что предложил Гоз, и я настоятельно рекомендую сделать это так.

0 голосов
/ 18 апреля 2011

Если вы сделали неверное предположение (то есть, предположить! = Randnum), то вы будете бесконечно повторно входить в цикл while ... т.е. Вам нужно только проверить предположение при получении QSpinBox::valueChanged().

...