青山烬 2024-04-25 17:48 采纳率: 0%
浏览 73

QT中UI线程同时刷新多个图表

现在的应用场景是,一个线程负责将下位机的数据存到消息队列中(死循环放数据),四个进程去取数据到各自的容器中并且将数据返回给ui线程(我加了读写锁不存在死锁的问题),分别设置四个定时器去倒计时刷新四个QChart图表,现在设置数据量为8192,但是只有第一个图表刷新了,其余三个没有动为什么,ui可以同时刷新四个图表吗?

img

ui是单线程,怎么实现刷新四个图表?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-25 17:49
    关注

    引自免费微信小程序:皆我百晓生

    在Qt中,UI线程是单线程的,这意味着所有的图形界面操作,包括更新图表,都必须在这个线程中完成。由于你已经确认数据获取和处理的部分已经在其他线程中完成,并且通过读写锁确保了数据同步,接下来你需要做的是正确地将这些数据传递回UI线程并更新图表。

    这里有一个可能的实现方案:

    首先,创建一个信号槽机制,用于从工作线程向UI线程发送数据更新的信号。每个图表都有一个单独的槽函数,接收并更新相应的图表。

    from PyQt5.QtCore import pyqtSignal, QObject
    
    class DataUpdateHandler(QObject):
        data_updated = pyqtSignal(int, list)  # 参数分别为图表ID和数据列表
    

    然后,在你的主线程中,实例化这个类,并连接信号槽。

    # 在主窗口类中
    self.data_handler = DataUpdateHandler()
    self.data_handler.data_updated.connect(self.update_chart)
    
    def update_chart(self, chart_id, data):
        self.charts[chart_id].update_data(data)
    

    接下来,在处理数据的工作线程中,当数据准备好后,调用信号来通知UI线程更新图表。

    def process_data(self, data):
        ...
        self.data_handler.data_updated.emit(chart_id, processed_data)
    

    最后,update_data方法应该是每个图表类的一个成员,它负责更新图表的实际数据。这里是一个简单的例子,假设你使用的是QLineSeries来表示数据系列:

    class ChartWidget(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            ...
            self.line_series = QLineSeries()
            self.chart_view = QChartView(self.chart)
            self.chart.addSeries(self.line_series)
            ...
    
        def update_data(self, new_data):
            self.line_series.replace(self.line_series.xValues(), new_data)
            self.chart_view.update()
    

    这样,你应该能够在不阻塞UI线程的情况下,同时更新多个图表。如果你发现某些图表没有更新,可能是数据传递或者槽函数关联出现问题,需要检查相关代码逻辑。另外,确保你的定时器也设置在UI线程中,因为定时器的操作也需要在主线程中进行。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月25日