web-dev-qa-db-ja.com

PyQt4.QtCore.pyqtSignalオブジェクトには属性「connect」がありません

作成したクラスのカスタム信号に問題があります。

関連コード:

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'

助けて?前もって感謝します。

52
Dane Larsen

私はあなたとまったく同じ問題を抱えていました。

移動してみてください

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)

これはあなたが探しているものとはまったく異なるかもしれませんが、私にとってはうまくいきました。とにかく、古いスタイルのシグナルに切り替えました。新しいスタイルのシグナルには、パラメーターの数やタイプが未定義になる方法が見つからなかったからです。

98
Joel Verhagen

カスタムクラスでsuper()またはQObject.__init__()の呼び出しに失敗した場合にも、このエラーメッセージが表示されます。

PythonのQtのクラスでカスタム信号を定義するためのチェックリスト:

  • クラスはQObjectから派生します(直接的または間接的に)
  • クラス___init___はsuper()を呼び出します(またはQObject.__init__()を直接呼び出します。)
  • シグナルはインスタンス変数ではなくクラス変数として定義されます
  • シグナルのシグネチャ(仮引数)は、シグナルに接続するスロットのシグネチャと一致します。 _()_または_(int)_または_(str)_または_((int,), (str,))_
65
bootchk

私は最近PySide(Nokia独自のPyQtバージョン)の使用を開始しましたが、カスタムの新しいスタイルの信号でまったく同じ動作(およびソリューション)を確認しました。ソリューションに対する私の最大の懸念は、クラス変数を使用して信号を保持すると、そのクラスのインスタンス(私の場合はQThreads)が複数ある場合に混乱することでした。

私が見ることができるものから、QtCore.QObject.__init__(self)はクラス内のSignal変数を見つけ、インスタンスのそのSignalのコピーを作成します。 QObject.__init__()が何をするのかわかりませんが、結果のSignalは適切なconnect()disconnect()およびemit()メソッド(および__getitem__() method)、QObject派生クラスの外部で作成されたクラスSignalまたはスタンドアロンSignal変数にはこれらのメソッドがなく、適切に使用できません。

10
Jare

シグナル/スロットシステムを使用するには、QObjectを継承したクラスが必要です。

以下に簡単な例を示します。



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

      def __init__(self,name):
        QtCore.QObject.__init__(self) # 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 __== '__main__':
      firstHuman = LivingBeing('Adam')
      firstHuman.summonFromClay()

 
4
Lokinou

同じ問題がありました。クラスがシグナルを使用する場合、QObjectを継承する必要があることを忘れていました。私はいくつかのリファクタリングを行っていたが、これには注意を払わなかった。

3
FrancoLM