题
我开始学习的Qt4和Python,以及一些教程中,我在interwebs发现以下。我有以下两个文件:
lcdrange.py:
from PyQt4 import QtGui, QtCore
class LCDRange(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
lcd = QtGui.QLCDNumber(2)
self.slider = QtGui.QSlider()
self.slider.setRange(0,99)
self.slider.setValue(0)
self.connect(self.slider, QtCore.SIGNAL('valueChanged(int)'),
lcd, QtCore.SLOT('display(int)'))
self.connect(self.slider, QtCore.SIGNAL('valueChanged(int)'),
self, QtCore.SIGNAL('valueChanged(int)'))
layout = QtGui.QVBoxLayout()
layout.addWidget(lcd)
layout.addWidget(self.slider)
self.setLayout(layout)
def value(self):
self.slider.value()
def setValue(self,value):
self.slider.setValue(value)
main.py:
import sys
from PyQt4 import QtGui, QtCore
from lcdrange import LCDRange
class MyWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
quit = QtGui.QPushButton('Quit')
quit.setFont(QtGui.QFont('Times', 18, QtGui.QFont.Bold))
self.connect(quit, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
grid = QtGui.QGridLayout()
previousRange = None
for row in range(0,3):
for column in range(0,3):
lcdRange = LCDRange()
grid.addWidget(lcdRange, row, column)
if not previousRange == None:
self.connect(lcdRange, QtCore.SIGNAL('valueChanged(int)'),
previousRange, QtCore.SLOT('setValue(int)'))
previousRange = lcdRange
layout = QtGui.QVBoxLayout()
layout.addWidget(quit)
layout.addLayout(grid)
self.setLayout(layout)
app = QtGui.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
当运行此我得到以下错误:
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
Object::connect: No such slot LCDRange::setValue(int)
我读过PyQt的插槽无非方法,这是我定义的比较多,所以我在做什么错了?
我也学习的Qt4用Ruby这也正是此代码源于,我翻译它从红宝石到Python。在Ruby版本LCDRange类类被定义为这样的:
class LCDRange < Qt::Widget
signals 'valueChanged(int)'
slots 'setValue(int)'
def initialize(parent = nil)
...
所以我的想法是,我必须以某种方式宣布自定义槽的存在?
解决方案
尝试这种情况:
self.connect(lcdRange, QtCore.SIGNAL('valueChanged'), previousRange.setValue)
有什么区别?
PyQt的文档一>具有约在PyQt的信号/插槽部分,它们的工作方式略有不同。
SIGNAL
SIGNAL('valueChanged')
是一种叫做短期电路信号。他们的工作只为Python到Python的方法,但他们更快,更容易实施。
SLOT
如果你有蟒插槽,可以只通过倾斜法指定:previousRange.setValue
。这适用于被Python访问的所有方法。
如果您的插槽应该像C ++的Qt插槽可访问的,当你在你的代码试过,你必须使用一个特殊的语法。您可以找到有关 pyqtSignature装饰<信息/ A> PyQt的网站上。
其他提示
您忘了
@Qt.pyqtSlot()
上述方法使用的是作为槽。结果
例如你的代码看起来应该是这样
@Qt.pyqtSlot('const QPoint&')
def setValue(self,value):
self.slider.setValue(value)
下面是一个关于PyQt的槽装饰一个好的页:
再见
请注意
在“文本”的信号内必须在C ++ API文档匹配。
# This will work - its IDENTICAL to the documentation
QtCore.SIGNAL('customContextMenuRequested(const QPoint&)')
# this wont
QtCore.SIGNAL('customContextMenuRequested(QPoint&)')
# and this wont
QtCore.SIGNAL('customContextMenuRequested(const QPoint)')
# Spot the bug
QtCore.SIGNAL('selectionChanged(const QItemSelection,const QItemSelection&)')
^ < missing &
不隶属于 StackOverflow