PySide: более простой способ обновления графического интерфейса из другого потока.

У меня есть графический интерфейс PySide (Qt), который порождает несколько потоков. Иногда потокам необходимо обновить графический интерфейс. Я решил это следующим образом:

class Signaller(QtCore.QObject) :
    my_signal = QtCore.Signal(QListWidgetItem, QIcon)
signaller = Signaller()

class MyThread(threading.Thread):
    def __init__(self):
        super(IconThread, self).__init__()
        # ...

    def run(self) :
        # ...

        # Need to update the GUI
        signaller.my_signal.emit(self.item, icon)

#
# MAIN WINDOW        
# 
class Main(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        # ...

        # Connect signals
        signaller.my_signal.connect(self.my_handler)

    @QtCore.Slot(QListWidgetItem, QIcon)
    def my_handler(self, item, icon):
        item.setIcon(icon)

    def do_something(self, address):
        # ...

        # Start new thread 
        my_thread = MyThread(newItem)
        my_thread.start()

    # ...

Есть ли способ проще? Для создания сигналов, обработчиков и их подключения требуется несколько строк кода.

15
задан Petter 12 June 2012 в 07:12
поделиться