4

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

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

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

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

提前感谢您的任何回复。

4

2 回答 2

6

我添加了一个如何发出信号并连接到另一个插槽的示例。文档也很有帮助

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_())
于 2012-04-17T05:08:57.523 回答
4

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

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语法来连接信号和插槽
于 2015-12-18T15:48:31.977 回答