当前位置:  开发笔记 > 编程语言 > 正文

PyQt:没有这样的插槽

如何解决《PyQt:没有这样的插槽》经验,为你挑选了1个好方法。

我开始学习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与Ruby,这是代码的起源,我将它从Ruby翻译成Python.在Ruby版本中,LCDRange类定义如下:

class LCDRange < Qt::Widget
  signals 'valueChanged(int)'
  slots 'setValue(int)'

  def initialize(parent = nil)
  ...

所以我的猜测是我必须以某种方式声明自定义插槽的存在?



1> Georg Schöll..:

试试这个:

self.connect(lcdRange, QtCore.SIGNAL('valueChanged'), previousRange.setValue)
有什么不同?

PyQt文档中有一节关于PyQt中的SIGNALS/SLOTS,它们的工作方式略有不同.

信号

SIGNAL('valueChanged')是一种称为短路信号的东西.它们仅适用于Python-to-Python方法,但它们更快,更容易实现.

SLOT

如果你有一个python插槽,你可以通过倾斜方法来指定它:previousRange.setValue.这适用于Python可访问的所有方法.

如果您的插槽应该像C++ Qt插槽一样可访问,就像您在代码中尝试的那样,您必须使用特殊语法.您可以在PyQt网站上找到有关pyqtSignature装饰器的信息.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有