我有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_())
“MainWindow.ui.label3无法访问”,因为
label3
不存在,也不存在ui
MainWindow
是一个class,一个实例的“模板”因此,
MainWindow
类对象没有名为ui
的属性(因此,也没有ui.label3
),但是您在代码末尾附近创建的mainWindow
实例会要实现你想要的,至少有两种方法
使用信号/插槽允许实例之间的通信
为CustomLabel类创建一个信号,并在鼠标进入时发出该信号;然后从主窗口连接该信号:
使用事件筛选器捕获事件
在本例中,我们在要监视事件的小部件上install an event filter,如果该事件是鼠标输入事件,我们将相应地更新第三个标签:
作为旁注,您似乎在试图编辑由
pyuic
生成的文件的内容(或者,至少,您可能在试图模仿它们的行为)。这是永远不应该做的事情,因为这些文件仅用于在实际程序中作为导入模块使用(它们模仿它们的行为并不是从代码创建GUI的最佳方式)。阅读有关using Designer的更多信息,了解使用设计器创建的文件的正确方法。
如果您需要通过子类化来扩展默认的Qt小部件,并且需要在Designer上使用这些类,那么请对使用“升级的小部件”进行一些研究
相关问题 更多 >
编程相关推荐