作成したクラスのカスタム信号に問題があります。
関連コード:
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'
助けて?前もって感謝します。
私はあなたとまったく同じ問題を抱えていました。
移動してみてください
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)
これはあなたが探しているものとはまったく異なるかもしれませんが、私にとってはうまくいきました。とにかく、古いスタイルのシグナルに切り替えました。新しいスタイルのシグナルには、パラメーターの数やタイプが未定義になる方法が見つからなかったからです。
カスタムクラスでsuper()
またはQObject.__init__()
の呼び出しに失敗した場合にも、このエラーメッセージが表示されます。
PythonのQtのクラスでカスタム信号を定義するためのチェックリスト:
__init__
_はsuper()
を呼び出します(またはQObject.__init__()
を直接呼び出します。)()
_または_(int)
_または_(str)
_または_((int,), (str,))
_私は最近PySide(Nokia独自のPyQtバージョン)の使用を開始しましたが、カスタムの新しいスタイルの信号でまったく同じ動作(およびソリューション)を確認しました。ソリューションに対する私の最大の懸念は、クラス変数を使用して信号を保持すると、そのクラスのインスタンス(私の場合はQThreads)が複数ある場合に混乱することでした。
私が見ることができるものから、QtCore.QObject.__init__(self)
はクラス内のSignal変数を見つけ、インスタンスのそのSignalのコピーを作成します。 QObject.__init__()
が何をするのかわかりませんが、結果のSignalは適切なconnect()
、disconnect()
およびemit()
メソッド(および__getitem__()
method)、QObject派生クラスの外部で作成されたクラスSignalまたはスタンドアロンSignal変数にはこれらのメソッドがなく、適切に使用できません。
シグナル/スロットシステムを使用するには、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()
同じ問題がありました。クラスがシグナルを使用する場合、QObjectを継承する必要があることを忘れていました。私はいくつかのリファクタリングを行っていたが、これには注意を払わなかった。