单击事件在带有 Qlabels 的 pyqt5 中不起作用

click event not work in pyqt5 with Qlabels

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class memuActions(QLabel):
    clicked = pyqtSignal()
    def __init__(self,title,parent,width,height,src):
        QLabel.__init__(self, title ,parent=parent)
        self.cont=QLabel(parent)
        self.cont.resize(width,height)
        self.cont.setObjectName("cont")
        self.cont.setStyleSheet("#cont::hover{background-color:#EBEBEB;}")
        
        self.ico=QLabel(self.cont)
        self.ico.resize(self.cont.width(),40)
        self.ico.setPixmap(QPixmap(src))
        self.ico.setScaledContents(True)

        self.ds=QLabel(title,self.cont)
        self.ds.setWordWrap(True)
        self.ds.resize(self.cont.width(),25)
        self.ds.setAlignment(Qt.AlignCenter)
        self.ds.setStyleSheet("color:red;")
        self.ds.move(2,self.ico.height()+2)

    def move(self,x,y):
        self.cont.move(x,y)

    def mousePressEvent(self, event):
        self.clicked.emit()

        
class main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(800,600)

        af=memuActions("ASD",self,60,60,"aa.png")
        af.move(100,50)
        af.clicked.connect(self.a)


    def a(self):
        print("PL")

app=QApplication([])
win=main()
win.show()
sys.exit(app.exec_())
    


我想为此定义一个点击事件class但是没有报错,代码不能正常工作。
在这个class中,我想设计一个按钮,用户可以点击它来调用函数并执行特定的操作。

我想运行一个方法通过点击 我的英语不流利,我不能很好地提出我的问题。谢谢你。回答这个问题。

您的代码存在各种问题,最重要的是对 parent/child 关系的普遍误解。

memuActions 实例是用 window 作为父实例创建的,但是 self.cont 是用 相同的 window 创建的作为父项,因此 self.count 及其所有子项将是 window 的子项,而不是 memuActions.

的子项

另一个问题与您没有使用 layout managers 这一事实有关,这将导致小部件保留默认大小:使用父级创建的所有小部件的默认大小为 100x30。

由于您使用错误的父级创建所有其他小部件,它们实际上覆盖了您的 menuActions 小部件,因此它永远不会获得正确的鼠标单击事件。

如果您想创建一个具有固定几何形状的自定义小部件,并且您不将该小部件添加到布局中,您必须手动设置其大小,或者通过resize()setMinimumSize()。由于您的小部件由许多子项组成,因此您必须使用 childrenRect() 来找到最终大小,它是子项的所有几何图形的组合。

然后,cont 小部件被像素图标签覆盖,它永远不会接收悬停事件。为了避免这种情况,您必须使标签对鼠标事件透明,以便下的小部件能够接收它们。

最后,考虑到 Qt 不鼓励使用主 window 的直接子代,因为你应该 总是 使用 central widget:

Note: Creating a main window without a central widget is not supported. You must have a central widget even if it is just a placeholder.

您无论如何都应该为该中央小部件使用布局管理器,否则调整 window 的大小可能会部分(或完全)隐藏其内容。

无论如何,这是您的代码的更正版本和工作版本。

class memuActions(QLabel):
    clicked = pyqtSignal()
    def __init__(self, title, parent, width, height, src):
        QLabel.__init__(self, title, parent=parent)
        self.cont = QLabel(self)
        self.cont.resize(width, height)
        self.cont.setObjectName("cont")
        self.cont.setStyleSheet("#cont::hover{ background-color:#EBEBEB; }")
        
        self.ico = QLabel(self)
        self.ico.setAttribute(Qt.WA_TransparentForMouseEvents)
        self.ico.resize(width, 40)
        self.ico.setPixmap(QPixmap(src))
        self.ico.setScaledContents(True)

        self.ds = QLabel(title, self)
        self.ds.setWordWrap(True)
        self.ds.resize(width, 25)
        self.ds.setAlignment(Qt.AlignCenter)
        self.ds.setStyleSheet("color:red;")
        self.ds.move(2, self.ico.height() + 2)

        self.resize(self.childrenRect().size())

    def mousePressEvent(self, event):
        self.clicked.emit()

注:
1。 class(和常量)应该总是使用大写的名称,所以你应该调用你的classes MemuActionsMain;
2。请使用空格,避免它们不会对性能或内存产生任何影响,它只会让你的代码 糟糕 并且读起来很烦人;在官方 Style Guide for Python Code(又名 PEP-8)上阅读更多关于这个和其他非常重要方面的信息。