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()

该回答引用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() 关联起