我在 QT 中创建了 GUI 应用程序。它有一些按钮和一个标签。该程序在一个while循环中顺序地从视频文件中获取图像,并通过刷新将它们显示在标签上。启动时,按钮工作正常,但是当我单击播放按钮并开始视频显示时,其他按钮无法单击,如果我坚持单击它们,程序没有响应并停止工作。即使我想了很多,我也无法弄清楚。我认为不需要代码来显示这个问题,但如果你要求,我可以发布它的相关部分
提前致谢。
我在 QT 中创建了 GUI 应用程序。它有一些按钮和一个标签。该程序在一个while循环中顺序地从视频文件中获取图像,并通过刷新将它们显示在标签上。启动时,按钮工作正常,但是当我单击播放按钮并开始视频显示时,其他按钮无法单击,如果我坚持单击它们,程序没有响应并停止工作。即使我想了很多,我也无法弄清楚。我认为不需要代码来显示这个问题,但如果你要求,我可以发布它的相关部分
提前致谢。
问题是当你的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!
}
为什么要在标签上显示图像?
您可能需要一个线程来读取和循环播放视频。这样其他输入仍然可以处理,并且不会使您的应用程序崩溃。
如果您使用的是 Repaint 方法,而不是使用 repaint 方法,您可以使用
QCoreApplication::processEvents();
它必须解决你的问题。