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?

Était-ce utile?

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:

cliquez sur: -)

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 &
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top