我开始学习的Qt4和Python,以及一些教程中,我在interwebs发现以下。我有以下两个文件:

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用Ruby这也正是此代码源于,我翻译它从红宝石到Python。在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的信号/插槽部分,它们的工作方式略有不同。

SIGNAL

SIGNAL('valueChanged')是一种叫做短期电路信号。他们的工作只为Python到Python的方法,但他们更快,更容易实施。

SLOT

如果你有蟒插槽,可以只通过倾斜法指定:previousRange.setValue。这适用于被Python访问的所有方法。

如果您的插槽应该像C ++的Qt插槽可访问的,当你在你的代码试过,你必须使用一个特殊的语法。您可以找到有关 pyqtSignature装饰<信息/ A> 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