0

QTでGUIアプリケーションを作成しました。いくつかのボタンとラベルがあります。このプログラムはビデオ ファイルから画像を while ループで順番に取得し、更新してラベルに表示します。起動時はボタンは正常に動作しますが、再生ボタンをクリックしてビデオ表示を開始すると、他のボタンをクリックすることができず、どうしてもクリックしようとすると、プログラムが応答せずに動作しなくなります。いろいろ考えても思いつきませんでした。この問題を示すためにコードを表示する必要はないと思いますが、リクエストがあれば、その関連部分を投稿できます

前もって感謝します。

4

3 に答える 3

2

問題は、while()ループが実行されているときに、イベント ループに制御が返されないことです。イベント ループは、キューに入れられた再描画イベントなどをディスパッチします。おそらく、次のように、タイマーによってトリガーされるスロットで一度に 1 つの画像を実行することをお勧めします。

class Gui {
Q_OBJECT
...
protected slots:
  void openFile(const QString &);
  void nextImage();
protected:
  QTimer imageTimer;
};

void Gui::Gui(...)
{
   ...
   connect(imageTimer, SIGNAL(timeout()), SLOT(nextImage());
   ...
}

void Gui::openFile(const QString & fileName)
{
   const int imagePeriod = 1000/25; // [ms], set to 25 frames per second
   ...
   imageTimer.start(imagePeriod);
}

void Gui::nextImage()
{
   QImage p;
   // read image from the file onto the image
   ui.label->setPixmap(p);
   // no need to call update() on the label!
}
于 2012-06-07T21:54:01.540 に答える
0

なぜラベルに画像を表示するのですか?

ビデオを読み取ってループするスレッドが必要になる可能性があります。そうすれば、他の入力を引き続き処理でき、アプリケーションがクラッシュすることはありません。

于 2012-06-07T21:33:43.840 に答える
0

Repaint メソッドを使用している場合は、repaint メソッドを使用する代わりに、単に使用できます

        QCoreApplication::processEvents();

それはあなたの問題を解決しなければなりません。

于 2012-06-07T22:04:38.573 に答える