QT表单按钮不';当标签使用while循环更新时,不要在QT表单上工作

QT表单按钮不';当标签使用while循环更新时,不要在QT表单上工作,qt,qt-creator,Qt,Qt Creator,我已经在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方法,那么您可以使用

        QCoreApplication::processEvents();

它必须解决你的问题。

为什么不呢?qt中的标签可以通过setPixmap方法显示图片。这不是主要问题。它不必禁用按钮,。我可能忽略了什么。因为在我过去的项目中,它工作没有问题。但当我使用循环时,表单看起来像是在循环中卡住了,对我的按钮点击没有反应。不幸的是,目前我还不能用线程进行编码,“但当我使用循环时,表单看起来会在循环中阻塞”。我想这就是问题所在。我想你需要一根线。它们并不太复杂。我建议您熟悉它们。:)谢谢,我知道我必须学习使用线程:)但现在我必须寻找其他我能做的事情。向一个在一个线程中难以理解事件循环的人扔线程并不是一个好建议。线程不是万能的。好吧,多亏了你,我理解了我的错误。重绘方法在那里不起作用。我改用processEvent方法,它现在可以工作了。再次感谢。不要使用
processEvents()
,因为它会重新输入您的代码,这是错误的做法。是的,它能用,但设计不好。要以固定速率更新图像:使用计时器触发更新。您可以准备QImages并将它们放入单独线程的队列中,然后在Gui线程中使用它们。看看我的其他答案,了解如何在Qt.Bulls Eye中进行interhtread通信!这就是我刚才想出来的。它解决了这个问题。谢谢;)