Question
Je commence à apprendre Qt4 et Python, suivant le long de certains tutoriel je l'ai trouvé sur les interwebs. Je les deux fichiers suivants:
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_())
Quand je cours ce que je reçois les erreurs suivantes:
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)
J'ai lu que les créneaux horaires PyQt ne sont plus que des méthodes, que je l'ai défini, donc ce que je fais mal?
Je suis aussi apprendre Qt4 avec Ruby qui est où ce code provient, je l'ai traduit de Ruby à Python. Dans la version Ruby la classe LCDRange est définie comme ceci:
class LCDRange < Qt::Widget
signals 'valueChanged(int)'
slots 'setValue(int)'
def initialize(parent = nil)
...
Alors je pense est que je dois déclarer en quelque sorte l'existence de la fente personnalisée?
La solution
Essayez ceci:
self.connect(lcdRange, QtCore.SIGNAL('valueChanged'), previousRange.setValue)
Quelle est la différence?
La documentation PyQt a une section sur / EMPLACEMENTS dans SIGNALS PyQt, ils travaillent un peu différemment.
SIGNAL
SIGNAL('valueChanged')
est ce qu'on appelle un court signal de circuit . Ils ne fonctionnent que pour les méthodes Python-à-Python, mais ils sont plus rapides et plus faciles à mettre en œuvre.
SLOT
Si vous avez une fente de python, vous pouvez spécifier simplement en inclinant la méthode: previousRange.setValue
. Cela fonctionne pour toutes les méthodes accessibles par Python.
Si vos emplacements doivent être accessibles comme les slots Qt C +, comme vous avez essayé dans votre code, vous devez utiliser une syntaxe spéciale. Vous pouvez trouver des informations sur pyqtSignature décorateur sur le site PyQt.
Autres conseils
vous avez oublié de mettre
@Qt.pyqtSlot()
ci-dessus la méthode que vous utilisez comme emplacement.
Par exemple, votre code devrait ressembler à ceci
@Qt.pyqtSlot('const QPoint&')
def setValue(self,value):
self.slider.setValue(value)
Voici une bonne page sur décorateur emplacement pyqt:
Bye
NOTE
Le "texte" dans le signal doit correspondre au c ++ documentation de l'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 &