Frage
Ich beginne Qt4 und Python, folgende entlang einiger Tutorial zu lernen i auf den interwebs gefunden. Ich habe die folgenden zwei Dateien:
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_())
Wenn ich das ich laufe bekommen die folgenden Fehler:
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)
Ich habe gelesen, dass PyQt Slots sind nichts anderes als Methoden, die ich definiert haben, so was mache ich falsch?
Ich bin auch Qt4 Ruby lernen die ist, wo dieser Code stammt aus, ich es von Ruby nach Python übersetzt. In der Ruby-Version wird die LCDRange Klasse wie folgt definiert:
class LCDRange < Qt::Widget
signals 'valueChanged(int)'
slots 'setValue(int)'
def initialize(parent = nil)
...
Also meine Vermutung war, dass ich muß irgendwie die Existenz des Kundengobo erklären?
Lösung
Versuchen Sie folgendes:
self.connect(lcdRange, QtCore.SIGNAL('valueChanged'), previousRange.setValue)
Was ist der Unterschied?
Die PyQt Dokumentation hat einen Abschnitt über SIGNAL / Steckt in PyQt, sie ein wenig anders funktionieren.
SIGNAL
SIGNAL('valueChanged')
ist etwas genannt kurz- Schaltungssignal . Sie arbeiten nur für Python-to-Python-Methoden, aber sie sind schneller und einfacher zu implementieren.
SCHLITZ
Wenn Sie ein Python-Steckplatz haben, können Sie es geben Sie einfach durch die Methode tipping: previousRange.setValue
. Dies funktioniert für alle Methoden zugänglich von Python.
Wenn Sie Ihre Slots wie C ++ Qt Schlitze zugänglich sein sollten, wie Sie in Ihrem Code versucht, müssen Sie eine spezielle Syntax. Hier finden Sie Informationen über pyqtSignature Dekorateur auf der PyQt Website.
Andere Tipps
vergessen haben, setzen
@Qt.pyqtSlot()
obige Verfahren Sie als Slot verwenden.
Zum Beispiel Ihr Code sollte wie folgt aussehen
@Qt.pyqtSlot('const QPoint&')
def setValue(self,value):
self.slider.setValue(value)
Hier ist eine gute Seite über pyqt Slot Dekorateur:
Bye
Hinweis
Der "Text" im SIGNAL muss die C ++ API-Dokumentation entsprechen.
# 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 &