如何检测鼠标单击使用PySide创建的GUI中显示的图像

时间:2012-04-17 04:11:17

标签: python qt user-interface pyside

首先,我是Python,Qt和PySide的新手,请原谅我,如果这个问题看起来太简单了。

我要做的是在使用PySide API构建的GUI中的网格中显示一堆照片。此外,当用户点击照片时,我希望能够显示与该照片相对应的信息。另外,我希望用于显示照片的容器/小部件允许更改照片,例如我应该能够替换网格中的任何照片,而不会再次从头开始创建整个网格照片。

最初我尝试使用QLabel来显示QPixmap,但我意识到(无论是否错误)我无法检测标签上的鼠标点击。经过一些搜索,我得到的印象是我应该继承QLabel(或其他一些相关的类)并以某种方式覆盖QWidget(QLabel的父类)mousePressEvent()以启用鼠标点击检测。问题是我不知道该怎么做或是否有任何替代小部件我可以用来包含我的照片而不是QLabel而不必经过子类定制。

任何人都可以建议一个比QLabel更合适的容器来显示照片,同时允许我检测照片上的鼠标点击或提供一些代码片段,用于子类化QLabel以使其能够检测鼠标点击吗?

提前感谢您的回复。

2 个答案:

答案 0 :(得分:6)

我添加了一个如何发出信号并连接到另一个插槽的示例。此外docs非常有帮助

from PySide.QtCore import *
from PySide.QtGui import *

import sys


class Main(QWidget):


    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout  = QHBoxLayout(self)

        picture = PictureLabel("pic.png", self)
        picture.pictureClicked.connect(self.anotherSlot)

        layout.addWidget(picture)
        layout.addWidget(QLabel("click on the picture"))

    def anotherSlot(self, passed):
        print passed
        print "now I'm in Main.anotherSlot"


class PictureLabel(QLabel):

    pictureClicked = Signal(str) # can be other types (list, dict, object...)

    def __init__(self, image, parent=None):
        super(PictureLabel, self).__init__(parent)        
        self.setPixmap(image)

    def mousePressEvent(self, event):
        print "from PictureLabel.mousePressEvent"
        self.pictureClicked.emit("emit the signal")

a = QApplication([])
m = Main()
m.show()
sys.exit(a.exec_())

答案 1 :(得分:3)

即使问题已经得到解答,我想提供一种可以在不同情况下使用的其他方法(见下文):

from PySide.QtCore import *
from PySide.QtGui import *

import sys

class Main(QWidget):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout  = QHBoxLayout(self)
        picture = QLabel()
        picture.setPixmap("pic.png")
        layout.addWidget(picture)
        layout.addWidget(QLabel("click on the picture"))

        makeClickable(picture)
        QObject.connect(picture, SIGNAL("clicked()"), self.anotherSlot)

    def anotherSlot(self):
        print("AnotherSlot has been called")

def makeClickable(widget):
    def SendClickSignal(widget, evnt):
        widget.emit(SIGNAL('clicked()'))
    widget.mousePressEvent = lambda evnt: SendClickSignal(widget, evnt)


a = QApplication([])
m = Main()
m.show()
sys.exit(a.exec_())

这种方式并不意味着继承QLabel,因此它可以用来为使用QtDeigner制作的小部件添加逻辑。

优点:

  • 可以在QTdesigner编译文件上使用
  • 可以应用于任何类型的小部件(您可能需要对覆盖的函数进行super调用以确保小部件的正常行为)
  • 可以使用相同的逻辑发送其他信号

缺点:

  • 您必须使用QObject语法连接信号和广告位