0

私は最近QTを学んでいて、do whileループをテストしたかったのですが、実際のログインは正常に機能しますが、QTではアプリケーションがフリーズします..ヘッダーファイル(public)で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

4 に答える 4

7

ループしていて、Qtに必要な処理を行わせないため、アプリケーションがフリーズします。

クラスコンストラクターでランダム推測を設定する必要があります。次に、on_pushButton_clicked呼び出しで、ifチェックを実行する必要があります。つまり、dowhileループを削除します。

コードはコールバック関数を終了し、制御はQtに戻り、ユーザーが別の推測を行えるようにします。

于 2011-04-18T08:45:35.663 に答える
1

私はQTの専門家ではありませんが、スピンボックスの値が正しくない場合、この関数で無限にループし、ユーザーがスピンボックスを再度クリックする可能性はありません。ループを削除randnumしてクラスコンストラクターのどこかに設定するだけで、問題はないはずです。

QTイベントループは、プログラムを存続させるための処理を行います。実行する必要はありません。

于 2011-04-18T08:45:15.083 に答える
0

間違った推測を行った場合(つまり、guess!= randnum)、whileループに無期限に再入します...つまり、中断はありません。を受け取ったときに推測を確認するだけで済みQSpinBox::valueChanged()ます。

于 2011-04-18T08:47:46.910 に答える
0

ユーザーが正しい番号を選択しなかった場合は、QCoreApplication :: processEvents()を呼び出して、イベントを処理するようにQtに指示します。

より良い解決策は、Gozが提案したことを実行することであり、そのようにすることを強くお勧めします。

于 2011-04-18T08:53:22.487 に答える