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

定时刷新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 全书网Java爬取数据
  • ¥15 SAP HANA SQL Script 。SUM OVER 怎么加where
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥60 为什么使用python对地震数据进行umap降维后,数据成图会出现不连续的现象
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
  • ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
  • ¥15 安卓qpython向ksweb服务器post文件失败