質問

私は私がinterwebsにあるいくつかのチュートリアルに沿って、以下、Qt4をとPythonを学ぶために始めています。

:私は、次の2つのファイルを持っています

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はスロットiが定義されている方法、以上のものではありませんので、私は間違って何をやっていることを読んだ?

私もこのコードは、私は、Pythonのルビーからそれを翻訳し、由来するところであるルビーとQt4をを学んでいます。 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は中SIGNALS /スロットに関するセクションがあります。

SIGNAL

SIGNAL('valueChanged')短期と呼ばれるものです回路信号に。彼らは、PythonツーPythonのメソッドに対してのみ動作しますが、彼らはより速く、より簡単に実装することです。

SLOT

previousRange.setValue:あなたがPythonのスロットを持っている場合は、

は、メソッドを傾けてそれを指定することができます。これは、Pythonによってアクセス可能なすべての方法で動作します。

あなたのコードで試してみましたとして、あなたのスロットが、C ++ Qtのスロットのようにアクセスできる必要がある場合は、

、あなたは特別な構文を使用する必要があります。あなたは pyqtSignatureデコレータについての情報を見つけることができます PyQtはウェブサイト上でます。

scroll top