【发布时间】:2017-07-01 05:55:54
【问题描述】:
我有以下代码,但它抱怨我无法从我的线程访问 UI 数据。在下面的示例代码中,我可以访问userInputString 值以便我的线程可以运行的最佳方式是什么?
self.nameField 是 PyQt QLineEdit。
QObject::setParent: 无法设置父级,新父级在不同的线程中
QPixmap:在 GUI 线程之外使用像素图是不安全的
QWidget::repaint:检测到递归重绘
import myUI
class MainUIClass(QtGui.QMainWindow, myUI.Ui_MainWindow):
def __init__(self, parent=None):
super(MainUIClass, self).__init__(parent)
self.setupUi(self)
self.startbutton.clicked.connect(self.do_work)
self.workerThread = WorkerThread()
self.connect(self.workerThread, SIGNAL("myThreading()"), self.myThreading, Qt.DirectConnection)
def do_work(self):
self.userInputString = self.nameField.Text()
self.workerThread.start()
def myThreading(self):
if userInputString is not None:
#Do something
class WorkerThread(QThread):
def __init__(self, parent=None):
super(WorkerThread, self).__init__(parent)
def run(self):
self.emit(SIGNAL("myThreading()"))
if __name__ == '__main__':
a = QtGui.QApplication(sys.argv)
app = MainUIClass()
app.show()
a.exec_()
【问题讨论】:
-
您应该阅读“如何以正确的方式使用 QThread”stackoverflow.com/questions/16879971/…blog.debao.me/2013/08/… 您也在使用旧式信号...对于您的问题,您应该使用信号和插槽...你在一个线程中运行你的进程,然后从这个线程向可以访问 GUI 元素的 GUI 线程发送信号
-
感谢您指出这一点。我要做的就是能够从我的线程类中访问“userInputString”值,但不知道如何将该值从 MainUI 类传递给线程类。您认为共享多线程 Array 或 Value 数据类型会是另一种实现方式吗?
-
@joke4me。您问题中的代码不会产生这些错误消息。事实上,稍作修正后,它的工作原理完全符合预期。请阅读有关如何提供minimal reproducible example 的指南。
标签: python multithreading pyqt signals-slots qthread