1

whileループを実行しているコードを作成していて、ループ内で、QLineEditのsetText()を使用していくつかのテキストボックスの内容を変更しようとしています。ただし、ループ内でsetTextを呼び出すだけでは機能しません。テキストボックスは、各反復ではなく、コードが実行された後にのみ実際の値を変更します。

私はC++またはQtの経験がほとんどありませんが、私が取り組んでいるプロジェクトではそれらを使用する必要があります。何か助けはありますか?

編集:これは、私が慣れていない/知識がないために単に問題を抱えているという単純なものに違いないと思いますが、より多くの情報が必要な場合は喜んで提供します!

4

2 に答える 2

4

問題は、QLineEdit の外観を更新するために、QT が UI スレッドのイベント ループに戻るための制御を必要とすることです。イベント ループを実行する手っ取り早い方法は、 をQCoreApplication::processEvents()呼び出すたびに を追加することsetText()です。これを修正する適切な方法は、テキスト ボックスの値を設定するブロッキング プロセスを別のスレッドに移動し、updateText(QString text)シグナルを公開し、それを TextBox のsetText(const QString & text)スロットに接続して、テキストを更新するたびにそのシグナルを発行することです。

詳細については、同様の質問に対する私の回答を参照してください: QProgressBar の読み込みが完了した後の原因不明の遅延

また、QThreads と Qt シグナル スロット システムに関するドキュメントの一部を確認することもできます

于 2013-01-18T18:36:00.570 に答える
1

私の場合、 repaint() または processEvents() だけを呼び出してもうまくいきません。

関数ループ内で、 との両方 QCoreApplication::processEvents();を呼び出しrepaint();ます。

for (i;...)
{
    //do your calculations
    //...

    QCoreApplication::processEvents();
    repaint();
}

ui->mywidget->update() を呼び出しても、違いはありませんでした。

(Kubuntu 12.10 の Qt4.8.3 および Windows XP の Qt5.0.1 でテスト済み)

于 2013-03-26T19:08:54.963 に答える