我想使用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(),但它没有帮助。
顺便说一句,我无法重现这个场合,有时会发生,有时候不会。我需要代表任何方法吗?或者我以错误的方式调用方法?或者是否有其他可行的方法?
非常感谢您的帮助。
答案 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(....);
}
};