0

我在 QT 中创建了 GUI 应用程序。它有一些按钮和一个标签。该程序在一个while循环中顺序地从视频文件中获取图像,并通过刷新将它们显示在标签上。启动时,按钮工作正常,但是当我单击播放按钮并开始视频显示时,其他按钮无法单击,如果我坚持单击它们,程序没有响应并停止工作。即使我想了很多,我也无法弄清楚。我认为不需要代码来显示这个问题,但如果你要求,我可以发布它的相关部分

提前致谢。

4

3 回答 3

2

问题是当你的while()循环正在执行时,你永远不会将控制权返回给事件循环。事件循环调度排队的重绘事件等。您可能希望在计时器触发的插槽中一次执行一张图像,如下所示:

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 回答