如何从子类访问MainWindow.Widget?

2024-05-20 23:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3个QLabel:label1、label2和label3

我的想法是:当鼠标悬停在label1或label2上时,label3.text将根据鼠标悬停的标签显示“鼠标在label1上”或“鼠标在label2上”

我为label1和label2创建了一个子类“CustomLabel”,其中定义了enterEvent函数

问题是我无法从该类访问label3

MainWindow.ui.label3无法访问

这是代码,除了一行代码我没有设法访问label3之外,所有的东西都在工作

我是一个非常初学者,所以可能我错过了一些非常简单的东西

from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(688, 446)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label1 = CustomLabel(self.centralwidget)
        self.label1.setGeometry(QtCore.QRect(110, 110, 121, 31))
        self.label1.setObjectName("label1")
        self.label2 = CustomLabel(self.centralwidget)
        self.label2.setGeometry(QtCore.QRect(320, 110, 121, 31))
        self.label2.setObjectName("label2")
        self.label3 = QtWidgets.QLabel(self.centralwidget)
        self.label3.setGeometry(QtCore.QRect(190, 280, 121, 31))
        self.label3.setObjectName("label3")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label1.setText(_translate("MainWindow", "Label1"))
        self.label2.setText(_translate("MainWindow", "Label2"))
        self.label3.setText(_translate("MainWindow", "Label3"))


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)


class CustomLabel(QtWidgets.QLabel):

    def __init__(self,texte):
        Custom_font = QtGui.QFont()
        Custom_font.setPointSize(14)
        super(CustomLabel,self).__init__(texte)
        self.setFont(Custom_font)

    def enterEvent(self,e):
        print('here is ',self.text())
        MainWindow.ui.label3.setText('mouse on ', self.text)   # Error on this line, 'MainWindow' has no attribute ui
        #MainWindow.label3.setText('mouse on ', self.text)       # Error here too, 'MainWindow' has no attribute label3


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()

    sys.exit(app.exec_())

Tags: textselfuideftranslatesettextlabel2label1
1条回答
网友
1楼 · 发布于 2024-05-20 23:20:52

“MainWindow.ui.label3无法访问”,因为label3不存在,也不存在ui

MainWindow是一个class,一个实例的“模板”

因此,MainWindow对象没有名为ui的属性(因此,也没有ui.label3),但是您在代码末尾附近创建的mainWindow实例

要实现你想要的,至少有两种方法

使用信号/插槽允许实例之间的通信

为CustomLabel类创建一个信号,并在鼠标进入时发出该信号;然后从主窗口连接该信号:

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.label1.entered.connect(self.labelEntered)
        self.ui.label2.entered.connect(self.labelEntered)

    def labelEntered(self, label):
        self.ui.label3.setText('mouse on {}'.format(label.text()))


class CustomLabel(QtWidgets.QLabel):
    entered = QtCore.pyqtSignal(object)

    def __init__(self,texte):
        Custom_font = QtGui.QFont()
        Custom_font.setPointSize(14)
        super(CustomLabel,self).__init__(texte)
        self.setFont(Custom_font)

    def enterEvent(self,e):
        self.entered.emit(self)

使用事件筛选器捕获事件

在本例中,我们在要监视事件的小部件上install an event filter,如果该事件是鼠标输入事件,我们将相应地更新第三个标签:

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.label1.installEventFilter(self)
        self.ui.label2.installEventFilter(self)

    def eventFilter(self, source, event):
        if isinstance(source, CustomLabel) and event.type() == QtCore.QEvent.Enter:
            # the "source" of the event is one of our custom labels, and the event
            # type is an "Enter" one, so let's update the other label
            self.ui.label3.setText('mouse on {}'.format(source.text()))
        return super(MainWindow, self).eventFilter(source, event)

作为旁注,您似乎在试图编辑由pyuic生成的文件的内容(或者,至少,您可能在试图模仿它们的行为)。这是永远不应该做的事情,因为这些文件仅用于在实际程序中作为导入模块使用(它们模仿它们的行为并不是从代码创建GUI的最佳方式)。
阅读有关using Designer的更多信息,了解使用设计器创建的文件的正确方法。
如果您需要通过子类化来扩展默认的Qt小部件,并且需要在Designer上使用这些类,那么请对使用“升级的小部件”进行一些研究

相关问题 更多 >