Dan*_*sen 52 signals pyqt pyqt4
在我制作的课程中,我遇到了自定义信号的问题.
相关代码:
self.parse_triggered = QtCore.pyqtSignal()
def parseFile(self):
self.emit(self.parse_triggered)
Run Code Online (Sandbox Code Playgroud)
这两个属于类:RefreshWidget.在它的父类我有:
self.refreshWidget.parse_triggered.connect(self.tabWidget.giveTabsData())
Run Code Online (Sandbox Code Playgroud)
当我尝试运行该程序时,我收到错误:
AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'
Run Code Online (Sandbox Code Playgroud)
救命?提前致谢.
Joe*_*gen 102
我和你有同样的问题.
试着移动
self.parse_triggered = QtCore.pyqtSignal()
Run Code Online (Sandbox Code Playgroud)
超出你的构造函数但在你的类声明中.所以不是看起来像这样:
class Worker(QtCore.QThread):
def __init__(self, parent = None):
super(Worker, self).__init__(parent)
self.parse_triggered = QtCore.pyqtSignal()
Run Code Online (Sandbox Code Playgroud)
它应该如下所示:
class Worker(QtCore.QThread):
parse_triggered = QtCore.pyqtSignal()
def __init__(self, parent = None):
super(Worker, self).__init__(parent)
Run Code Online (Sandbox Code Playgroud)
这可能不是你想要的,但它对我有用.我无论如何都切换回旧式信号,因为我没有在新式信号中找到一种方法来获得未定义的数字或类型的参数.
boo*_*chk 65
如果您未能调用super()或QObject.__init__()在自定义类中,也会收到该错误消息.
用于在Python中的Qt中定义类中的自定义信号的清单:
__init__电话super()(或QObject.__init__()直接打电话.)()或(int)或(str)或((int,), (str,))小智 10
我最近开始使用PySide(诺基亚自己的PyQt版本),并看到了与自定义新式信号完全相同的行为(和解决方案).我对该解决方案的最大担心是,当我有该类的多个实例(在我的情况下是QThreads)时,使用类变量来保存信号会搞砸.
从我所看到的,QtCore.QObject.__init__(self)在类中找到Signal变量并为该实例创建该Signal的副本.我不知道该怎么QObject.__init__()做,但由此产生的信号也正确connect(),disconnect()和emit()方法(也是一个__getitem__()方法),而类信号或创建一个QObject派生类之外没有这些方法和独立的信号变量不能使用正常.
要使用信号/插槽系统,您需要有一个 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 __name__ == '__main__':
firstHuman = LivingBeing('Adam')
firstHuman.summonFromClay()