ysfxincsdn 2023-03-08 13:39 采纳率: 66.7%
浏览 21
已结题

定时刷新QGraphicsTextItem的文字时报错

基于QGraphcisview做了个绘图软件,上面用QGraphicsTextItem显示了几个文本图元,在用线程定时器定时刷新文本内容时(方法:self.setPlainText(newText)),提示:QObject: Cannot create children for a parent that is in a different thread.;
但是调用self.setRotation(self._angle)可以旋转文本,
改变文本值与旋转实现方法有何不同呢,self.setPlainText是重新赋值,不是新建呀。

  • 写回答

3条回答 默认 最新

  • IT小哥哥呀 2023-03-08 13:47
    关注

    这是因为Qt的GUI部分不是线程安全的。只有主线程才能更改UI元素。如果你想在非主线程中更改UI元素,你需要使用Qt提供的线程信号和槽机制。

    在你的情况下,调用 self.setRotation(self._angle) 不会引发错误,因为它只更改了QGraphicsTextItem的旋转属性,并不涉及到文本图元在场景中的父对象。而调用 self.setPlainText(newText) 则涉及到重新创建文本图元,因此会引发错误。

    为了解决这个问题,你可以在主线程中使用QTimer来定时更改文本图元的属性。在定时器的回调函数中,使用信号和槽机制将更新后的文本信息发送给主线程,然后在主线程中更新QGraphicsTextItem的文本属性。具体实现方式如下:

    
    from PyQt5.QtCore import QObject, pyqtSignal, QTimer
    from PyQt5.QtGui import QGraphicsTextItem
    
    class MyTextItem(QGraphicsTextItem):
        update_text = pyqtSignal(str)
        
        def __init__(self, text, parent=None):
            super().__init__(text, parent)
            self.timer = QTimer(self)
            self.timer.timeout.connect(self.updateText)
            self.timer.start(1000)  # 1秒钟刷新一次
    
        def updateText(self):
            # 在这里更新文本信息
            new_text = "Hello World"
            self.update_text.emit(new_text)
    
    class MainWindow(QObject):
        def __init__(self):
            super().__init__()
            self.textItem = MyTextItem("Hello", parent=None)
            self.textItem.update_text.connect(self.updateText)
    
        def updateText(self, new_text):
            # 在这里更新QGraphicsTextItem的文本属性
            self.textItem.setPlainText(new_text)
    
    

    在这个示例中,我们创建了一个名为 MyTextItem 的QGraphicsTextItem的子类,并使用QTimer定期更新文本信息。在定时器回调函数中,我们发出了一个信号,将新的文本信息发送到主线程。然后在主线程中,我们连接了 update_text 信号到 updateText 槽函数中,并在 updateText 函数中更新了QGraphicsTextItem的文本属性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行