qt5 QGraphicsScene setBackgroundBrush()在频繁调用时并不总是有效
qt5 QGraphicsScene setBackgroundBrush() not always work when called frequently
我想用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(....);
}
};
相关文章:
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- 除了字符串或宏调用之外,是否存在任何情况,其中"(<"是有效的字符流?
- 让构造函数在其初始化列表中调用同一类的另一个构造函数是否有效
- boost::asio 使用 post() 时没有调用处理程序,当直接调用函数时有效(io_context有工作)
- “A a = A()”有效吗?下面调用了哪些运算符/方法
- 从第二个线程调用Qt信号有效 - >对连接的插槽没有影响
- 重构后,异步调用方法不再有效
- qt5 QGraphicsScene setBackgroundBrush()在频繁调用时并不总是有效
- 在C++中嵌入Python:在Python脚本中导入模块在一个函数调用过程中有效,但在另一个调用过程中无效
- 系统( "command" ) 产生错误;但它在直接从 Bash 提示符调用时有效
- 当从一个应用程序调用时,在DLL方法中创建COM接口指针是有效的,但当从另一个应用软件调用时则无效
- 如何在constexpr函数中有效地调用_BitScanReverse或__builtin_clz
- 在UDP套接字上多次调用Connect()以发送到不同的目标地址 - 有效
- 将基类的引用传递给 boost::thread 并在派生类中调用虚函数是否有效
- C++如何判断static.lib是否有效,是否可从外部代码调用
- 调用不带参数的构造函数有效,使用参数则无效。为什么?
- 编译时调度:以有效调用为条件