【发布时间】:2015-10-11 15:54:26
【问题描述】:
我在QGraphicsView 上有两种类型的QGraphicsItems,其中一种在场景中,例如 z-index 为 1 的网格,另一种是蚂蚁,在 z-index 的顶部2. 启动程序时,我将所有蚂蚁设置为位置 0,0 并将它们添加到场景中。但随后我开始通过在它们上调用setPos() 将这些蚂蚁从另一个线程中移出——然后我的电脑吃掉了蚂蚁!他们消失在他们的旧位置,但不会出现在他们的新位置。新位置在场景内。
这是Ant类的代码(继承QGraphicsItem):
#include "ant.h"
#include "constants.h"
#include <QPainter>
Ant::Ant()
{
setZValue(2);
}
QRectF Ant::boundingRect() const
{
return QRect(QPoint(0,0), G_FIELD_RECT_SIZE);
}
void Ant::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
Q_UNUSED(item)
Q_UNUSED(widget)
QBrush b = painter->brush();
if (food())
painter->setBrush(Qt::blue);
else
painter->setBrush(Qt::black);
painter->drawEllipse(2,3, G_FIELD_RECT_WIDTH - 4, G_FIELD_RECT_HEIGHT - 6);
painter->setBrush(b);
}
经过更多测试,我发现只要我从 Qt 事件线程中调用 setPos,一切正常。一旦我在自定义线程中调用它,蚂蚁就会消失。知道如何解决这个问题吗?
【问题讨论】:
-
你应该把 UI 的东西都放在主线程中。 Qt 在这方面存在设计限制。您可以将计算卸载到另一个线程,但所有 GUI 交互都必须在主线程中,
-
@ddriver Ant 类实际上只是用于图形的东西,另一个线程上运行的另一个类正在调用导致问题的
setPos方法
标签: c++ multithreading qt qthread qgraphicsitem