繁体   English   中英

单击事件在带有 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 中,我想设计一个按钮,用户可以单击该按钮来调用 function 并执行特定操作。

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

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

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

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

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

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

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

最后,考虑到 Qt 不鼓励使用主 window 的直接子级,因为您应该始终使用中央小部件

注意:不支持创建没有中央小部件的主 window。 即使它只是一个占位符,您也必须有一个中央小部件。

无论如何,您应该为该中央小部件使用布局管理器,否则调整 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(和常量)应始终使用大写名称,因此您应该调用您的类MemuActionsMain
2.请使用空格,避免它们不会对性能或memory产生任何影响,它只会让你的代码变得糟糕而且阅读起来很烦人; Python 代码(又名 PEP-8)的官方样式指南中阅读有关此方面和其他非常重要方面的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM