gpt4 book ai didi

c++ - 从不同线程调用 setPos 时 QGraphicsItem 消失

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:06 25 4
gpt4 key购买 nike

我在 QGraphicsView 上有两种类型的 QGraphicsItem,这两种类型中的一种在场景中就像 z-index 为 1 的网格,另一种是 Ant ,在它们之上,z-index 2。启动程序时,我将所有 Ant 设置为位置 0,0 并将它们添加到场景中。但随后我开始通过对它们调用 setPos() 将这些 Ant 从另一个 Thread 移走 - 然后我的计算机吃掉了这些 Ant !他们消失在他们原来的位置,但不会出现在他们的新位置。新位置在场景内部。

这是 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 一切正常。一旦我在自定义线程中调用它, Ant 就会消失。知道如何解决这个问题吗?

最佳答案

您必须回到主线程来执行setPos。正如 ddriver 评论的那样,你不应该从线程修改 GUI(你通常会在这样做时收到 qDebug 消息,你在调试器窗口中没有得到任何消息吗?)。

你只需要:

  • 向您的 Ant 类添加一个新信号(例如 signalSetPos( QPoint pos ))
  • 向您的 Ant 类添加一个新插槽(如 doSetPos( QPoint pos ))。此插槽实现仅调用 setPos(pos)
  • 使用 Qt::QueuedConnectionQt::BlockingQueuedConnection 连接它们(connect 函数的第五个参数,用于 GUI 更新,Qt::QueuedConnection 可能更可取,因为它不会阻塞您的线程。
  • 从您曾经执行 setPos( newPos ) 的线程中,只需发出 signalSetPos( newPos )。然后,doSetPos 将被执行(稍后如果您使用 Qt::QueuedConnection,如果您使用 Qt::BlockingQueuedConnection 则立即执行)线程。

查看此帖子以获取有关从线程发出信号的更多信息: Qt - emit a signal from a c++ thread

关于c++ - 从不同线程调用 setPos 时 QGraphicsItem 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com