質問
私は私が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はウェブサイト上でます。
他のヒント
は、
置くことを忘れてしまいました
@Qt.pyqtSlot()
あなたはスロットとして使用されている方法の上。
あなたのコードは次のようになります。たとえば、
@Qt.pyqtSlot('const QPoint&')
def setValue(self,value):
self.slider.setValue(value)
ここではPyQtはスロットデコレータについての一つの良いページがあります:
さようなら
注
C ++ APIのドキュメントと一致している必要がありSIGNAL内の「テキスト」。
# 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 &