簡體   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