Сигнал PyQt с аргументами произвольного типа / эквивалент PyQt_PyObject для сигналов нового стиля - PullRequest
8 голосов
/ 24 декабря 2010

У меня есть объект, который должен сигнализировать, что значение изменилось, испуская сигнал с новым значением в качестве аргумента.Тип значения может измениться, и поэтому я не уверен, как записать тип сигнала.Я знаю, что могу добиться этого, используя сигналы старого стиля, например:

self.emit(SIGNAL("valueChanged(PyQt_PyObject)"), newvalue)

, но как мне написать это, используя сигналы нового стиля?предыдущий вопрос относился к этому, но никакого "реального" ответа там не было.

Ответы [ 2 ]

18 голосов
/ 04 марта 2011

Во-первых, объект, из которого вы излучаете, нуждается в сигнале, определенном как атрибут его класса :

class SomeClass(QObject):
    valueChanged = pyqtSignal(object)  

Обратите внимание, что сигнал имеет один аргумент типа object, что должно позволить чему-либо проходить.Затем вы сможете излучать сигнал из класса, используя аргумент любого типа данных:

self.valueChanged.emit(anyObject)
5 голосов
/ 25 декабря 2010

Я новичок, и это первый вопрос, на который я пытаюсь ответить, поэтому прошу прощения, если я неправильно понял вопрос ...

Следующий код генерирует сигнал, который отправляет пользовательский объект Pythonи слот использует этот класс для печати «Hello World».

import sys
from PyQt4.QtCore import pyqtSignal, QObject

class NativePythonObject(object):
    def __init__(self, message):
        self.message = message

    def printMessage(self):
        print(self.message)
        sys.exit()

class SignalEmitter(QObject):
    theSignal = pyqtSignal(NativePythonObject)

    def __init__(self, toBeSent, parent=None):
        super(SignalEmitter, self).__init__(parent)
        self.toBeSent = toBeSent

    def emitSignal(self):
        self.theSignal.emit(toBeSent)

class ClassWithSlot(object):
    def __init__(self, signalEmitter):
        self.signalEmitter = signalEmitter
        self.signalEmitter.theSignal.connect(self.theSlot)

    def theSlot(self, ourNativePythonType):
        ourNativePythonType.printMessage()

if __name__ == "__main__":
    toBeSent = NativePythonObject("Hello World")
    signalEmitter = SignalEmitter(toBeSent)
    classWithSlot = ClassWithSlot(signalEmitter)
    signalEmitter.emitSignal()
...