小墨墨墨 2023-02-21 22:01 采纳率: 88.2%
浏览 12
已结题

pyqt多线程处理ui界面类内函数

python pyqt程序,请问在程序中我在一个类中创建了一个thread线程,但是线程的函数我是写在类外面,我想访问类里面的函数,就是ui界面中的qtablewidget,我把窗口类穿给了thread进程,但是在qt界面中,仍然不显示我新加的数据,请问怎么解决啊,要将线程函数定义在类中吗?
下面是定义的类外的线程函数

def thread_job(zcanlib,que,myshow):

下面是在类中创建的进程函数

    def connectStartCan(self):
        global chn_handle
        chn_handle=can_I_start(zcanlib,handle,0)
        print("channel handle:%d." % (chn_handle))
        t = threading.Thread(target=thread_job,args=(zcanlib,que,myshow))
        t.start()

  • 写回答

1条回答 默认 最新

  • CodeBytes 2023-02-21 22:15
    关注

    该回答引用ChatGPT

    在PyQt中,如果想在线程中访问UI界面的控件(如QTableWidget),需要使用信号(signal)和槽(slot)机制来实现,以保证线程和UI界面的同步更新。

    一般情况下,建议将线程函数定义在类中,这样可以更方便地访问类中的属性和方法,也可以更方便地使用信号和槽机制来实现线程和UI界面的通信。具体的实现方法如下:

    在类中定义线程函数 thread_job(),在其中使用信号 update_table 来更新QTableWidget控件中的数据。

    
    from PyQt5.QtCore import QThread, pyqtSignal
    
    class MyThread(QThread):
        update_table = pyqtSignal(int, int, str) # 信号,用于更新QTableWidget
    
        def __init__(self, zcanlib, que, myshow):
            super(MyThread, self).__init__()
            self.zcanlib = zcanlib
            self.que = que
            self.myshow = myshow
    
        def run(self):
            # 在线程中执行耗时的任务
            while True:
                if not self.que.empty():
                    # 从队列中获取数据
                    data = self.que.get()
                    # 更新QTableWidget
                    self.update_table.emit(data[0], data[1], data[2])
    
    

    在上述代码中,我们继承了QThread类,并定义了一个信号 update_table,该信号有三个参数,分别是行号、列号和数据,用于更新QTableWidget控件中的数据。在线程函数 run() 中,我们通过不断检查队列中是否有数据,来获取需要更新的数据,并使用信号 update_table 发射信号。

    在窗口类中创建线程对象,并将自身作为参数传递给线程对象。然后,将线程对象的信号 update_table 与自身的槽函数 update_table_widget() 关联起来,用于更新QTableWidget控件。

    
    class MyWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MyWindow, self).__init__(parent)
            self.init_ui()
    
            # 创建线程对象,并将窗口对象作为参数传递给线程对象
            self.thread = MyThread(zcanlib, que, myshow)
            self.thread.update_table.connect(self.update_table_widget)
            self.thread.start()
    
        def init_ui(self):
            # 创建QTableWidget控件
            self.table_widget = QTableWidget(self)
            self.table_widget.setColumnCount(2)
            self.setCentralWidget(self.table_widget)
    
        def update_table_widget(self, row, col, data):
            # 更新QTableWidget控件
            item = QTableWidgetItem(data)
            self.table_widget.setItem(row, col, item)
    
    

    在上述代码中,我们在窗口类中创建了线程对象 self.thread,并将窗口对象 self 作为参数传递给线程对象。然后,我们将线程对象的信号 update_table 与窗口对象的槽函数 update_table_widget() 关联起

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 创建了问题 2月21日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来