PyQt QThread多线程不起作用 [英] PyQt QThread MultiThreading does not work

查看:579
本文介绍了PyQt QThread多线程不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个QListWidget列表,当从List1中选择某些项目时,正在填充List2.

I have 2 QListWidget lists, List2 is being filled when some item has been selected from List1

问题是,在填充List2之前,我必须执行很多任务,这会使我的UI冻结约5秒钟,这太烦人了,我想让它用QThread填充List2,但是自从初始化整个类之前,它就无法正常工作遇到一个烦人的错误

The problem is that, before filling List2 i have to do alot of tasks which freezes my UI for about 5 seconds which is too annoying, i want to make it fill List2 with QThread but it's not working since before initilizing whole class I'm getting an annoying error

from ui import Ui_Win
from PyQt4 import QtGui, QtCore

class GenericThread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)

    def __del__(self):
        self.quit()
        self.wait()

    def run(self):
        self.emit( QtCore.SIGNAL('itemSelectionChanged()'))
        return

class MainUI(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_Win()
        self.ui.setupUi(self)
        ...

        genericThread = GenericThread(self)
        self.connect(genericThread, QtCore.SIGNAL("itemSelectionChanged()"), self.fill_List2 )
        genericThread.start()

    def fill_List2(self):
        self.ui.List2.clear()
        list1SelectedItem = str(self.ui.List1.currentItem().text()) # ERROR HERE

跟踪: # AttributeError: 'NoneType' object has no attribute 'text'

这是因为self.ui.List1.currentItem().text()None

为什么在触发itemSelectionChanged信号之前调用此功能?

Why this fucntion is being called before triggering itemSelectionChanged signal?

推荐答案

from ui import Ui_Win ## ui.py is a file that has been generated from Qt Designer and it contains main GUI objects like QListWidget
from PyQt4 import QtGui, QtCore

class GenericThread(QtCore.QThread):
    def __init__(self, parent=None, listIndex=0):
        QtCore.QThread.__init__(self, parent)
        self.listIndex = listIndex

    def __del__(self):
        self.quit()
        self.wait()

    def run(self):
        if self.listIndex == 2:
            for addStr in Something:
                #Some long stuff
                self.emit( QtCore.SIGNAL('fillListWithItems(QString, int'), addStr, self.listIndex)

class MainUI(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_Win()
        self.ui.setupUi(self)
        ...

        self.ui.List1.list1SelectedItem.connect(self.fill_List2)

    @QtCore.pyqtSlot(QString, int)
    def self.fillListWithItems(addStr, lstIdx):
        if lstIdx==2:
            self.ui.List2.addItem(addStr)

    def fill_List2(self):
        self.ui.List2.clear()
        list1SelectedItem = str(self.ui.List1.currentItem().text())

        genericThread = GenericThread(self, listIndex=2)
        self.connect(genericThread, QtCore.SIGNAL("fillListWithItems(QString, int)"), self.fillListWithItems )
        genericThread.start()

感谢@ekhumoro

Thanks @ekhumoro

这篇关于PyQt QThread多线程不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆