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