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?

War es hilfreich?

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:

klicken: -)

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 &
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top