qt5 QGraphicsScene setBackgroundBrush()在频繁调用时并不总是有效

qt5 QGraphicsScene setBackgroundBrush() not always work when called frequently

本文关键字:有效 调用 setBackgroundBrush QGraphicsScene qt5      更新时间:2023-10-16

我想用qt5 MinGw32编写一个客观注释工具,它可以注释视频文件中的对象,并在播放时播放。因此QGraphicsScene被继承来实现该函数。

当我频繁更改QGraphicsScene的背景(例如每秒30帧)时,会发生一些错误:大多数时候它都能按预期工作,而有时背景无法移动。

这是我的代码:

void MyGraphicsScene::UpdateFrame(QImage image)
{
QPixmap pixmap = QPixmap::fromImage(image);
//fix the view's size and scene's size
views().first()->setFixedSize(pixmap.size());
setSceneRect(0,0, pixmap.width(), pixmap.height());
setBackgroundBrush(QBrush(pixmap));
}
...
//In another thread
void Thread::run()
{
...
myScene.UpdateFrame(newImage);
...
}

我搜索了qt的文档,没有找到答案。

然而,有一件奇怪的事:

当错误的事情发生时,我发现背景继续变化,但除非我将应用程序移动到另一个屏幕(我有两个屏幕),否则屏幕上不会显示变化。然而,随着应用程序的移动,QGraphicsScene的背景只改变了一次,之后就变成了静态。

我想背景已经更改,但没有重新绘制,所以我使用了update(),但没有帮助。

顺便说一句,我无法重现当时的情景,有时会发生,有时不会。

我需要表示任何方法吗?或者我用错误的方式调用了这些方法?或者有其他可行的方法吗?

非常感谢您提前提供的帮助。

您不应该通过直接调用方法来更改不同线程中的QtGui元素。

使用Qt信号槽概念。不需要调用update()。

class MyGraphicsScene{...
....
signals:
void singalFromThread(QImage image);
public:
//CTor
MyGraphicsScene()
{
connect(this, SIGNAL(singalFromThread(QImage)),this,SLOT(UpdateFrame(QImage)));
}
//Call this method from your thread
void updateForwarder(QImage image)
{
//Jump into gui thread
emit singalFromThread(image);
}
public slots:

void UpdateFrame(QImage image)
{
setBackgroundBrush(....);
}

};
相关文章: