PyQt4.QtCore.pyqtSignal объект не имеет атрибута «подключиться» - PullRequest
51 голосов
/ 04 июня 2010

У меня проблемы с пользовательским сигналом в классе, который я создал.

Соответствующий код:

self.parse_triggered = QtCore.pyqtSignal()

def parseFile(self):
    self.emit(self.parse_triggered)

Оба из них принадлежат классу: RefreshWidget. В родительском классе у меня есть:

self.refreshWidget.parse_triggered.connect(self.tabWidget.giveTabsData())

Когда я пытаюсь запустить программу, я получаю сообщение об ошибке:

AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'

Помощь? Заранее спасибо.

Ответы [ 6 ]

95 голосов
/ 04 июня 2010

У меня была такая же проблема, как и у вас.

Попробуйте переместить

self.parse_triggered = QtCore.pyqtSignal()

вне вашего конструктора, но внутри вашего объявления класса. Поэтому вместо того, чтобы выглядеть так:

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

        self.parse_triggered = QtCore.pyqtSignal()

Это должно выглядеть так:

class Worker(QtCore.QThread):
    parse_triggered = QtCore.pyqtSignal()

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

Возможно, это совсем не то, что вы ищете, но это сработало для меня. В любом случае я снова переключился на сигналы старого стиля, потому что в сигналах нового стиля не нашел способа иметь неопределенное число или тип параметров.

64 голосов
/ 28 сентября 2012

Вы также получите это сообщение об ошибке, если вам не удастся вызвать super() или QObject.__init__() в вашем пользовательском классе.

Контрольный список для определения пользовательских сигналов в классе в Qt в Python:

  • ваш класс является производным от QObject (прямо или косвенно)
  • ваш класс __init__ звонит super() (или звонит QObject.__init__() напрямую.)
  • ваш сигнал определен как переменная класса, а не переменная экземпляра
  • подпись (формальные аргументы) вашего сигнала совпадает с подписью любого слота, который вы подключите к сигналу, например, () или (int) или (str) или ((int,), (str,))
10 голосов
/ 12 сентября 2010

Я недавно начал работать с PySide (собственная версия PyQt от Nokia) и увидел точно такое же поведение (и решение) с настраиваемыми сигналами нового стиля. Моя самая большая проблема с решением состояла в том, что использование переменной класса для хранения сигнала могло бы испортить ситуацию, когда у меня несколько экземпляров этого класса (в моем случае QThreads).

Из того, что я мог видеть, QtCore.QObject.__init__(self) находит переменную Signal в классе и создает копию этого Signal для экземпляра. Я понятия не имею, что делает QObject.__init__(), но результирующий Сигнал делает правильные методы connect(), disconnect() и emit() (а также метод __getitem__()), тогда как переменные класса Signal или Signal создаются вне Производный от QObject класс не имеет этих методов и не может использоваться должным образом.

4 голосов
/ 18 июля 2013

Чтобы использовать систему сигналов / слотов, вам нужен унаследованный класс QObject.

Вот простой пример:



    from PySide import QtCore
    class LivingBeing(<b>QtCore.QObject</b>):
      bornSignal = QtCore.Signal() # initialise our signal

      def __init__(self,name):
        <b>QtCore.QObject.__init__(self)</b> # initialisation required for object inheritance
        self.bornSignal.connect(self.helloWorld) # connect the born signal to the helloworld function
        self.name = name #
        self.alive = False

      def summonFromClay(self):
        self.alive = True
        self.bornSignal.emit() # emit the signal

      def helloWorld(self):
         print "Hello World !, my name is %s, this place is so great !" % self.name

    # now try the little piece of code
    if __name__ == '__main__':
      firstHuman = LivingBeing('Adam')
      firstHuman.summonFromClay()

 
3 голосов
/ 19 апреля 2014

У меня была такая же проблема. Я забыл, что если класс использует Signals, он должен наследоваться от QObject. Я занимался ре-факторингом и не обращал на это внимания.

0 голосов
/ 04 июня 2010

Почему вы подключаетесь напрямую к сигналу, а вы можете сделать self.connect(widget, SIGNAL('parse_triggered()'), listener.listening_method)

где self - это, например, сама форма и может быть таким же, как слушатель

...