赞
踩
锋哥原创的PyQt6视频教程:
QObject是Qt库中最重要的类之一。作为所有Qt类的基类,QObject提供了信号槽机制、对象树、动态属性、元对象系统、事件处理机制、线程安全、国际化等许多重要特性,这些特性可以帮助开发者轻松实现模块间通信、组件化、程序设计以及事件处理等方面的功能。
在Qt框架下编程,不管用不用到Qt的特性,都推荐自定义类继承QObject类,这样在需要的时候,就可以随时使用Qt基于QObject类提供的各种特性和机制,而且可以让自定义的类很好地融入到Qt的框架之中。
具体来讲,QObject主要实现了以下特性:
1.信号槽机制:QObject通过定义信号(signal)和槽(slot)来实现对象间的通信。当信号被触发时,与该信号相对应注册的槽函数将会被自动调用。一个信号可以连接到多个槽函数上,也可以将多个信号连接到同一个槽函数。信号/槽机制是Qt中最强大和最独特的功能之一,可以帮助开发者在不同的对象之间进行通信,处理事件等。
2.对象树:QObject支持管理对象树结构的方式。它允许对象包含一个父对象和零个或多个子对象。当父对象被删除时,其所有子对象也会被自动销毁。这个特性使得我们在Qt程序中组织和管理QObject及其子类之间的依赖关系变得更容易。
3.动态属性:QObject支持添加动态属性。这意味着,除了一组已经存在的静态属性之外,每个对象实例还可以动态地创建和设置新的属性,这些属性不需要在编译器层面进行定义和声明。这种灵活性使得QObject能够适应各种场景的需求。
4.元对象系统:元对象系统(Meta-Object System)是QObject的另一个重要特性。它为每个QObject和其子类提供运行时类型信息,包括对象的类名、属性、方法和信号等信息,这些信息都可以在运行时被访问或者修改。元对象系统赋予了Qt框架独特的能力,例如能够自动序列化和反序列化对象以及其成员等,同时也是实现Qt信号槽机制的关键技术。
5.事件处理机制:QObject支持通过发送和接收事件来实现对象间的通信。Qt中的事件是指某种对象发生的一些动作或状态变化,通常包含一个事件类型和一些参数。QObject可以捕获并处理各种类型的事件,也可以派发(dispatch)事件给其他对象进行处理。
6.线程安全:QObject被设计为线程安全的基础构建单元。这意味着QObject默认可以在多线程环境下直接使用,而无需考虑同步问题。但是,如果需要在不同线程之间交互对象,还是需要小心地设计和管理线程模型。
7.国际化:QObject提供国际化(Internationalization / i18n)函数,帮助开发人员使应用程序能够方便地本地化,支持多语言切换。i18n函数提供消息翻译,日期和时间格式化以及数字格式转换等功能。
QObject setObjectName()方法 设置对象名称,理论上不可以重复。我们再给控件设置样式的时候,可以用到这个对象属性。
UI生成测试代码:
- from PyQt6 import QtCore, QtGui, QtWidgets
-
-
- class Ui_Form(object):
- def setupUi(self, Form):
- Form.setObjectName("Form")
- Form.resize(400, 300)
- self.label = QtWidgets.QLabel(parent=Form)
- self.label.setGeometry(QtCore.QRect(50, 60, 53, 15))
- self.label.setObjectName("label")
- self.label_2 = QtWidgets.QLabel(parent=Form)
- self.label_2.setGeometry(QtCore.QRect(50, 100, 53, 15))
- self.label_2.setObjectName("label_2")
- self.label_3 = QtWidgets.QLabel(parent=Form)
- self.label_3.setGeometry(QtCore.QRect(50, 140, 53, 15))
- self.label_3.setObjectName("label_3")
-
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
-
- def retranslateUi(self, Form):
- _translate = QtCore.QCoreApplication.translate
- Form.setWindowTitle(_translate("Form", "Form"))
- self.label.setText(_translate("Form", "信息1"))
- self.label_2.setText(_translate("Form", "信息2"))
- self.label_3.setText(_translate("Form", "信息3"))
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
label.qss代码:
- QLabel#label_2{
- color:red;
- font-size:18px;
- }
Main测试代码:
- """
- python加载ui文件
- 作者 : 小锋老师
- 官网 : www.python222.com
- """
- import sys
-
- from PyQt6.QtWidgets import QApplication, QLabel
- from PyQt6 import uic
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- # 加载qss样式
- with open("label.qss", "r") as f:
- app.setStyleSheet(f.read())
- ui = uic.loadUi("./基类QObject类介绍以及应用.ui")
- label: QLabel = ui.label
-
- ui.show()
-
- sys.exit(app.exec())
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
setProperty()方法可以给对象添加属性以及属性值。我们qss样式里面可以细化指定属性来设置样式,来实现设置归类样式。
qss改下:
- QLabel[level="error"]{
- color:red;
- font-size:18px;
- }
- QLabel[level="warning"]{
- color:blue;
- font-size:18px;
- }
Main测试代码:
- """
- python加载ui文件
- 作者 : 小锋老师
- 官网 : www.python222.com
- """
- import sys
-
- from PyQt6.QtWidgets import QApplication, QLabel
- from PyQt6 import uic
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- # 加载qss样式
- with open("label.qss", "r") as f:
- app.setStyleSheet(f.read())
- ui = uic.loadUi("./基类QObject类介绍以及应用.ui")
- label: QLabel = ui.label
- label_2: QLabel = ui.label_2
- label_3: QLabel = ui.label_3
- label.setProperty("level", "warning")
- label_2.setProperty("level", "error")
- label_3.setProperty("level", "error")
-
- ui.show()
-
- sys.exit(app.exec())
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。