Python 从修改的线程类设置QTableWidgetItem
我有一个特定的Python 从修改的线程类设置QTableWidgetItem,python,multithreading,pyqt5,python-multithreading,Python,Multithreading,Pyqt5,Python Multithreading,我有一个特定的PyQt5项目。在这个项目中,我需要同时做一些事情,因此使用线程。由于作业有时必须根据用户的要求取消,因此我使用了一个修改过的线程类(据我所知,该线程是可跟踪的,因此可能在任何时候被终止),我设法在线查找: class thread_with_trace(threading.Thread): def __init__(self, *args, **keywords): threading.Thread.__init__(self, *args, **keywords
PyQt5
项目。在这个项目中,我需要同时做一些事情,因此使用线程。由于作业有时必须根据用户的要求取消,因此我使用了一个修改过的线程类(据我所知,该线程是可跟踪的,因此可能在任何时候被终止),我设法在线查找:
class thread_with_trace(threading.Thread):
def __init__(self, *args, **keywords):
threading.Thread.__init__(self, *args, **keywords)
self.killed = False
def start(self):
self.__run_backup = self.run
self.run = self.__run
threading.Thread.start(self)
def __run(self):
sys.settrace(self.globaltrace)
self.__run_backup()
self.run = self.__run_backup
def globaltrace(self, frame, event, arg):
if event == 'call':
return self.localtrace
else:
return None
def localtrace(self, frame, event, arg):
if self.killed:
if event == 'line':
raise SystemExit()
return self.localtrace
def kill(self):
self.killed = True
当点击GUI上的某个按钮时,我使用这个修改过的线程:
self.t =thread_with_trace(target = self.runClicked)
self.t.start()
在self.runClicked
中,我必须设置QTableWidgetItem
(self.runClicked
还使用其他函数来更改QTableWidgetItem
)。例如:
def runClicked(self):
self.ui.results_table.clear()
while (self.ui.results_table.rowCount() > 0):
self.ui.results_table.removeRow(0)
self.ui.results_table.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem("Freq (Hz)"))
self.ui.results_table.setHorizontalHeaderItem(1, QtWidgets.QTableWidgetItem("Current (A)"))
self.ui.results_table.setHorizontalHeaderItem(2, QtWidgets.QTableWidgetItem("Mag. Field (mG)"))
当我使用线程运行此函数时,会收到两种类型的消息(但它们会重复很多次,可能是因为我经常更改表…):
QObject::connect:无法对“Qt::Orientation”类型的参数进行排队
(确保使用qRegisterMetaType()注册了“Qt::Orientation”。)
QObject::connect:无法对类型为“QVector”的参数排队
(确保使用qRegisterMetaType()注册了“QVector”。)
当我尝试更改标签或按钮的文本时,不会产生此问题
我在网上查看了一下,发现唯一“允许”在GUI中进行任何更改的线程是GUI创建的主线程本身(如果我在这一点上有错误,请纠正我),我应该以某种方式使用dataChanged
QObject::connect: Cannot queue arguments of type 'Qt::Orientation'
(Make sure 'Qt::Orientation' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QVector<int>'
(Make sure 'QVector<int>' is registered using qRegisterMetaType().)