문제

QT4와 Python을 배우기 시작했습니다. 다음 두 파일이 있습니다.

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 슬롯이 내가 정의한 방법에 지나지 않는다는 것을 읽었습니다. 그래서 내가 무엇을 잘못하고 있습니까?

나는 또한이 코드가 시작된 루비와 함께 QT4를 배우고 있으며, 루비에서 파이썬으로 번역했습니다. 루비 버전에서 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의 신호/슬롯에 대한 섹션이 있으며 약간 다르게 작동합니다.

신호

SIGNAL('valueChanged') a라는 것입니다 단락 신호. 그들은 파이썬-파이썬 방법에 대해서만 작동하지만 더 빠르고 구현하기 쉽습니다.

슬롯

파이썬 슬롯이있는 경우 메소드를 팁으로 만 지정할 수 있습니다. previousRange.setValue. 이것은 Python에서 액세스 할 수있는 모든 방법에 대해 작동합니다.

C ++ QT 슬롯과 같이 슬롯에 액세스 할 수있는 경우 코드에서 시도한대로 특수 구문을 사용해야합니다. 정보를 찾을 수 있습니다 pyqtsignature 데코레이터 PYQT 웹 사이트에서.

다른 팁

당신은 넣는 것을 잊었습니다


@Qt.pyqtSlot()

위의 메소드는 슬롯으로 사용합니다.

예를 들어 코드는 다음과 같아야합니다


@Qt.pyqtSlot('const QPoint&')
def setValue(self,value):
        self.slider.setValue(value)

다음은 pyqt 슬롯 데코레이터에 대한 좋은 페이지입니다.

클릭 :-)

안녕히 계세요

노트

신호 내의 "텍스트"는 C ++ 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 &
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top