【Qt问题】从其他线程调用setPos时QAbstractGraphicsShapeItem消失

在Qt编程中,尝试从其他线程调用QAbstractGraphicsShapeItem的setPos方法会导致对象消失。问题与QObject::startTimer错误消息相关,提示不能在非主线程启动定时器。解决方案是利用信号和槽机制,通过Qt::QueuedConnection在主线程中安全地更新QGraphicsItem的位置,避免跨线程访问。
摘要由CSDN通过智能技术生成

目录

1、问题分析

2、问题解决


1、问题分析

qt从另一个线程上调用到setPos。

  • 是的,我确实收到了调试消息QObject::startTimer: Timers cannot be started from another thread,不知道它们与该问题有关。
  • 也许QGraphicsItem::setPos使用startTimer。 您可以在Qt代码中搜索此消息,并在此处放置一个断点,以查看何时以及为什么到达该消息。

2、问题解决

在Qt中,QGraphicsItem及其派生类(比如QAbstrac

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt中,当你使用move()函数移动QGraphicsItem对象,可能会出现坐标抖动的问题。这是由于move()函数传递的坐标是整数,而QGraphicsItem对象的位置是浮点数,导致移动的位置不完全匹配。 为了解决这个问题,你可以使用setPos()函数来移动QGraphicsItem对象。这可以确保移动的位置是浮点数,并避免坐标抖动的问题。 以下是一个示例代码,它使用setPos()函数来移动一个圆形QGraphicsEllipseItem对象,避免了坐标抖动的问题。 ```cpp #include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsEllipseItem> #include <QTimer> int main(int argc, char *argv[]) { QApplication a(argc, argv); // Create a scene and view QGraphicsScene scene; QGraphicsView view(&scene); // Create a circle item QGraphicsEllipseItem *circle = new QGraphicsEllipseItem(0, 0, 50, 50); circle->setBrush(Qt::red); scene.addItem(circle); // Create a timer to move the circle QTimer timer; QObject::connect(&timer, &QTimer::timeout, [&]() { qreal speed = 1.0; // pixels per frame circle->setPos(circle->pos() + QPointF(speed, speed)); }); timer.start(10); view.show(); return a.exec(); } ``` 在此示例中,我们使用setPos()函数来移动圆形QGraphicsEllipseItem对象的位置。在QTimer的timeout信号中,我们使用QPointF来表示移动的距离,并将其添加到圆形对象的当前位置中。这可以确保移动的距离是浮点数,并避免坐标抖动的问题。 请注意,此示例中的速度值为1像素/帧,你可以根据需要调整此值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式职场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值