PyQt5之QObject对象的名称和属性设置

前言

通过Qt实例、实例名称、实例属性为控件设置样式。

QObject是Qt框架中的核心类之一,它提供了强大的对象模型功能。通过名称和属性的操作,可以更灵活地管理Qt对象,实现更复杂的应用逻辑。

1.1 API

QObject的API包括QObject对象的名称和属性的操作。

QObject对象名称操作

NO 方法 描述
1 setObjectName() 设置QObject对象的名称
2 objectName() 要获取QObject对象的名称

QObject对象属性操作

NO 方法 描述
1 setProperty() 设置动态属性
2 property() 获取动态属性
3 dynamicPropertyNames() 获取通过setProperty()设置的全部属性名称

1.1.1 setObjectName

用法

setObjectName(self, name: str)

描述

调用setObjectName(‘唯一名称’),为Qt对象设置一个名称,这个名称通常是唯一的,当作对象的ID使用。

1.1.2 objectName

用法

objectName(self) -> str

描述

调用objectName(),获取Qt对象的名称。

1.1.3 setProperty

用法

setProperty(self, name: str, value: Any) -> bool

描述

调用setProperty(‘属性名称’,值),为Qt对象动态设置属性和值。

1.1.4 property

用法

property(self, name: str) -> Any

描述

调用property(‘属性名称’),获取Qt对象的属性值。

1.1.5 dynamicPropertyNames

用法

dynamicPropertyNames(self) -> List[QByteArray]

描述

调用dynamicPropertyNames(),获取Qt对象中通过setProperty()设置的全部属性名称。

1.1.6 示例

代码如下:

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('学习QObject-梯阅线条')
        self.resize(500, 300)
        self.move(900, 300)
        self.set_ui()

    def set_ui(self):
        self.test_objnames_properties()

    @staticmethod
    def test_objnames_properties():
        obj = QObject()
        obj.setObjectName('notice')
        print(obj.objectName())

        obj.setProperty('notice_level_1', 'error')
        obj.setProperty('notice_level_2', 'warn')
        print(obj.property('notice_level_1'))
        print(obj.dynamicPropertyNames())


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    window = Window()

执行结果如下:

PyQt5之QObject对象的名称和属性设置1

1.2 应用场景

通过Qt实例、实例名称、实例属性为控件设置样式。

1.2.1 设置样式

用法

setStyleSheet(self, styleSheet: str)

描述

调用setStyleSheet(),设置Qt控件的外观,比如字体大小、背景颜色、文本颜色,边框样式等。

self:指的是调用这个方法的对象实例,比如一个按钮、文本框或者是整个应用程序的主窗口。

styleSheet:一个字符串,包含了用于定义控件外观的CSS样式规则。

示例

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('学习QObjecct-梯阅线条')
        self.resize(500, 300)
        self.move(900, 300)
        self.set_ui()

    def set_ui(self):
        self.test_stylesheet()

    def test_stylesheet(self):
        label = QLabel(self)
        # 设置控件文本
        label.setText('样式设置')
        # 设置控件样式
        label.setStyleSheet("""
        font-size:20px; 
        color:red;
        border:2px solid red;
        border-radius:8px;
        """)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

执行结果

PyQt5之QObject对象的名称和属性设置2

1.2.2 Qss样式

用法-全局样式

with open('QObject.qss') as qssf:
            qApp.setStyleSheet(qssf.read())

描述-全局样式

从QObject.qss文件读取样式字符串,设置给qApp全局对象。

描述-qss文件

将样式保存到.qss文件,使用实例、实例名称和属性作为选择器。

QLabel{}用于选择QLabel的全部实例;

QLabel#notice{}用于选择QLabel的全部实例,且id为“notice”的实例,对应objectName;

QLabel#notice[level='normal']{}用于选择QLabel的全部实例,且id为“notice”的实例,且属性level的值为’normal’的实例,对应property;

示例

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('学习QObjecct-梯阅线条')
        self.resize(500, 300)
        self.move(900, 300)
        self.set_ui()

    def set_ui(self):
        self.test_qss()

    def test_qss(self):
        with open('QObject.qss') as qssf:
            qApp.setStyleSheet(qssf.read())

        lab1 = QLabel(self)
        lab1.setText('normal')
        lab1.setObjectName('notice')
        lab1.setProperty('level', 'normal')
        lab1.move(10, 0)

        lab2 = QLabel(self)
        lab2.setText('warning')
        lab2.setObjectName('notice')
        lab2.setProperty('level', 'warning')
        lab2.move(10, 30)

        lab3 = QLabel(self)
        lab3.setText('error')
        lab3.setObjectName('notice')
        lab3.setProperty('level', 'error')
        lab3.move(10, 60)

        lab4 = QLabel(self)
        lab4.setText('lab4')
        lab4.setObjectName('notice')
        lab4.move(10, 90)

        lab5 = QLabel(self)
        lab5.setText('lab5')
        lab5.move(10, 120)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

执行结果

PyQt5之QObject对象的名称和属性设置3