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

时间:2017-01-31 07:49:14

标签: c++ qt mingw

我想使用qt5 MinGw32编写一个客观注释工具,它可以在视频文件中注释对象并在播放期间显示它们。所以 QGraphicsScene 继承了实现该功能。

当我经常更改QGraphicsScene的背景(例如30 fps)时会发生错误:大部分时间它按预期工作,有时背景无法移动。

这是我的代码:

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的文档但没有找到答案。

然而,有一些奇怪的事情:

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

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

顺便说一句,我无法重现这个场合,有时会发生,有时候不会。

我需要代表任何方法吗?或者我以错误的方式调用方法?或者是否有其他可行的方法?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您不应通过直接调用方法来更改其他线程中的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(....);
}


};