单击事件在带有 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 MemuActions
和Main
;
2。请使用空格,避免它们不会对性能或内存产生任何影响,它只会让你的代码 糟糕 并且读起来很烦人;在官方 Style Guide for Python Code(又名 PEP-8)上阅读更多关于这个和其他非常重要方面的信息。
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 MemuActions
和Main
;
2。请使用空格,避免它们不会对性能或内存产生任何影响,它只会让你的代码 糟糕 并且读起来很烦人;在官方 Style Guide for Python Code(又名 PEP-8)上阅读更多关于这个和其他非常重要方面的信息。