【问题标题】:Clickable Qlabel: Binding multiple labels to a single functionClickable Qlabel:将多个标签绑定到单个函数
【发布时间】:2020-02-01 16:21:19
【问题描述】:

我在 initUi 中声明了所有这些标签 它们是这样构造的:

        ligne_1_left_cord = 300
        self.label_ligne_1_1 = QtWidgets.QLabel(self)
        pic_signe_tab =QPixmap('img/tab.png')
        self.label_ligne_1_1.setPixmap(pic_signe_tab)
        self.label_ligne_1_1.move(ligne_1_left_cord,300)
        self.label_ligne_1_1.mousePressEvent = self.label_click

        self.label_ligne_1_2 = QtWidgets.QLabel(self)
        self.label_ligne_1_2.setPixmap(pic_signe_tab)
        self.label_ligne_1_2.move( ligne_1_left_cord +85,300)

当我点击 label_ligne_1_1 时,函数 label_click 会这样做:

def label_click(self,event):
        signe_pixmap = QPixmap('img/tabx.png')
        self.label_ligne_1_1.setPixmap(signe_pixmap)

当我调用 label_click 时,是否可以传递一个变量以将其绑定到所有标签并使用相同的函数? 像这样?:

def label_click(name_of_the_lable):
    name_of_the_lable.setPixmap(x)

当然意思是无论你点击哪个方块,像素图都会改变,并且会出现一个X

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    不建议以这种方式覆盖函数,尤其是对于 Qt 中被视为受保护的函数,这是 QObjects 和 QWidgets 的任何 *Event() 函数的情况。

    此外,在您的情况下,您只是用相同的签名覆盖了方法,这永远不会让您获得函数调用的来源。
    一个可能的解决方案是使用带有源的 lambda 作为关键字参数:

    self.label_ligne_1_1.mousePressEvent = lambda ev, label=self.label_ligne_1_1: self.label_click(label)
    

    但我不建议你这样做。 相反,更好的方法是在每个标签上安装event filter,然后在每次捕获鼠标按下事件时设置像素图:

    class Squares(QtWidgets.QWidget):
        def __init__(self):
            super().__init__()
            layout = QtWidgets.QGridLayout(self)
            layout.setSpacing(0)
    
            for row in range(4):
                for col in range(4):
                    square = QtWidgets.QLabel()
                    square.setPixmap(QtGui.QPixmap('tab.png'))
                    layout.addWidget(square, row, col)
                    setattr(self, 'label_ligne_{}_{}'.format(row + 1, col + 1), square)
                    square.installEventFilter(self)
    
        def eventFilter(self, source, event):
            if event.type() == QtCore.QEvent.MouseButtonPress:
                source.setPixmap(QtGui.QPixmap('tabx.png'))
            return super().eventFilter(source, event)
    

    【讨论】:

    • 我没有像您那样创建布局,但我通过执行 self.label_ligne_1_2.installEventFilter(self),按照您对我的每个标签的建议安装了一个事件过滤器。谢谢!
    • 为了简单起见,我使用了布局,但我还是建议您使用它,因为不同的系统可能会以不同的方式显示图像内容(取决于多种因素,但这主要是由于 DPI屏幕),导致图像意外显示,并可能重叠或尺寸过小。
    • 我愿意,我的代码已经太重复了,单独创建每个标签会占用大量空间。但我无法存档我图片中的确切结果。如果我使用您的布局,它们都在窗口中并间隔开。我需要它们在 windows bcs 的一个特定位置,这些标签列周围还有其他元素。比如标签和文字。无论如何,我可以使用与您的代码类似的内容存档相同的结果吗?
    • 我尝试(并建议)尽可能避免物体的任何固定定位。它通常需要考虑使用“正确”的布局方法(这可能导致使用嵌套布局),但它通常是最好的解决方案。无论如何,我无法在 cmets 中为您提供帮助;尝试通过一些测试得到它,如果仍然无法达到所需的结果,请创建一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2016-11-22
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多