PyQt - 继承QLabel

2 投票
3 回答
6857 浏览
提问于 2025-04-15 12:06

我想要继承QLabel这个类,以便在里面添加点击事件的处理。

我试了这个代码:

class NewLabel(QtGui.QLabel):
    def __init__(self, parent):
        QtGui.QLabel.__init__(self, parent)

    def clickEvent(self, event):
        print 'Label clicked!'

但是点击后,我没有看到'Label clicked!'这行信息。

编辑:

好吧,现在我不是用'clickEvent',而是用'mousePressEvent'。不过我还有一个问题。我怎么知道到底是哪个标签被点击了?比如,我有两个输入框和两个标签。标签的内容是图片,所以标签里没有文字,我无法区分这两个标签。我该怎么做呢?

编辑2:

我写了这个代码:

class NewLabel(QtGui.QLabel):
    def __init__(self, firstLabel):
        QtGui.QLabel.__init__(self, firstLabel)

    def mousePressEvent(self, event):
        print 'Clicked'
        #myLabel = self.sender()  # None =)
        self.emit(QtCore.SIGNAL('clicked()'), "Label pressed")

在另一个类里:

self.FirstLang = NewLabel(Form)
QtCore.QObject.connect(self.FirstLang, QtCore.SIGNAL('clicked()'), self.labelPressed)

同一个类里的槽函数:

def labelPressed(self):
    print 'in labelPressed'
    print self.sender()

但是在self里没有发送者对象。我哪里做错了?

3 个回答

1

来自PyQt Wiki的答案效果很好,但我想补充一点,clickable这个类应该在return True之前调用widget.mouseReleaseEvent,以防用户对这个事件进行了自定义。

3

在QWidget/QLabel里没有叫做clickEvent的函数。你可以把这个函数连接到Qt的信号上,或者你可以这样做:

class NewLabel(QtGui.QLabel):
    def __init__(self, parent=None):
        QtGui.QLabel.__init__(self, parent)
        self.setText('Lorem Ipsum')

    def mouseReleaseEvent(self, event):
        print 'Label clicked!'
1

针对你的第二个问题,我会继续基于@gnud的例子来讲:

  • 首先,创建一个QLabel的子类,重写鼠标释放事件(mouseReleaseEvent),并在这个类里添加一个信号,我们可以叫它clicked。
  • 在鼠标释放事件中,检查是哪个按钮被点击了,如果是左键,就发出clicked信号。
  • 把一个槽(slot)连接到你标签的clicked信号上,然后在槽里使用 sender() 来判断是哪个QLabel被点击了。

撰写回答