当前位置:   article > 正文

PYQT5学习笔记04——QObject对象和属性名称设置API以及对应案例_setobjectname

setobjectname

一、QObject对象和属性名称设置API

  简单介绍一下PyQt5最上层父类QObject的一些属性方法,并给出具体的使用过程示例。

1、setObjectName(“唯一名称”)和objectName()

  setObjectName方法的作用是给Qt对象设置一个名称,一般这个名称是唯一的,这个名称被当成对象的ID来使用。objectName方法的作用是获取设置的对象名称,示例代码如下:

# -*- coding: UTF-8 -*-
"""
@Date   :2023/4/22
"""
from PyQt5.Qt import *


class Window(QWidget):  # 创建一个类,并且继承QWidget这个父类,用来自定义样式
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法(因为子类重写了init方法,所以父类的被隐藏了,需要显示调用)
        self.setWindowTitle("QObject的学习")  # 设置子类的标题
        self.resize(500, 500)  # 设置子类的窗口大小
        self.setup_ui()

    def setup_ui(self):  # 增加子控件
        self.QObject对象名称和属性的操作()

    def QObject对象名称和属性的操作(self):
        # 测试API
        # 1、设置对象名称和获取对象名称(对象名称即为id,可以用id选择器设置样式)
        obj = QObject()
        obj.setObjectName("notice")
        print(obj.objectName())


if __name__ == '__main__':  # 只有右键启动才会执行该方法,被人调用Menu模块的话,不会执行该方法,方便编写人员测试使用
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

  具体效果如下:
在这里插入图片描述

2、setProperty(“属性名称”, 值 )和property(“属性名称”)和dynamicPropertyNames()

  setProperty方法的作用是给一个Qt对象动态的添加一个属性和值,property方法的作用是根据属性名称获取值,dynamicPropertyNames方法的作用是获取一个对象中所有通过setProperty设置的数下名称,代码示例如下:

# -*- coding: UTF-8 -*-
"""
@Date   :2023/4/22
"""
from PyQt5.Qt import *


class Window(QWidget):  # 创建一个类,并且继承QWidget这个父类,用来自定义样式
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法(因为子类重写了init方法,所以父类的被隐藏了,需要显示调用)
        self.setWindowTitle("QObject的学习")  # 设置子类的标题
        self.resize(500, 500)  # 设置子类的窗口大小
        self.setup_ui()

    def setup_ui(self):  # 增加子控件
        self.QObject对象名称和属性的操作()


    def QObject对象名称和属性的操作(self):
        # ***********************测试API**************************开始
        # # 设置键值对和获取键值对
        obj = QObject()
        obj.setProperty("notice_level", "error")
        obj.setProperty("notice_level2", "warning")
        #
        print(obj.property("notice_level"))
        #
        # # 获取所有的键
        print(obj.dynamicPropertyNames())

       


if __name__ == '__main__':  # 只有右键启动才会执行该方法,被人调用Menu模块的话,不会执行该方法,方便编写人员测试使用
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

  具体效果如下:
在这里插入图片描述

二、Qt对象名称和属性值应用案例

  刚刚演示过一遍Qt对象名称和属性值的代码示例之后,可能大家还有些模糊,这两个东西到底有什么用?接着我们就用一个案例来告诉大家这用什么用!!

  在进行案例之前,我们先来了解一下qss样式表,如果学过前端的同学可能会觉得怎么和css样式表这么像,其实qss样式表就是遵循的css样式表的规范来编写的。

  我们来看一下普通的没有加任何样式的GUI组件长什么样子,代码如下:

# -*- coding: UTF-8 -*-
"""
@Date   :2023/4/22
"""
from PyQt5.Qt import *


class Window(QWidget):  # 创建一个类,并且继承QWidget这个父类,用来自定义样式
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法(因为子类重写了init方法,所以父类的被隐藏了,需要显示调用)
        self.setWindowTitle("QObject的学习")  # 设置子类的标题
        self.resize(500, 500)  # 设置子类的窗口大小
        self.setup_ui()

    def setup_ui(self):  # 增加子控件
        self.QObject对象名称和属性的操作()

    def QObject对象名称和属性的操作(self):
        # **********************案例演示***************************开始

        label = QLabel(self)
        label.setText("社会我唐哥")
        
        label2 = QLabel(self)
        label2.setText("人狠话不多")
        label2.move(200, 200)
        
        label3 = QLabel(self)
        label3.setText("xxxx")
        label3.move(50, 50)
        
        label4 = QLabel(self)
        label4.setText("ooooo")
        label4.move(300, 300)



if __name__ == '__main__':  # 只有右键启动才会执行该方法,被人调用Menu模块的话,不会执行该方法,方便编写人员测试使用
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

  效果如下:
在这里插入图片描述

  接着我们加一句qss代码,给label设置一下字体大小和颜色,代码如下:

# 设置控件样式
label.setStyleSheet("font-size: 20px; color: red;")
  • 1
  • 2

  效果图如下:
在这里插入图片描述

  我们这是在程序代码里面直接设置样式,这样的话耦合性太高, 我们可以用一个文件来写qss代码,然后程序中读取该文件内容即可降低耦合性,创建一个QObject.qss文件,qss代码如下:

/*对所有QLabel组件都生效生效*/
QLabel{
    font-size: 20px;
    color: red;
}
  • 1
  • 2
  • 3
  • 4
  • 5

  读取qss文件的代码如下(因为可能全局都会使用,所以我们直接用qApp设置,但是也可以用局部app设置,看自己需要,记得把原来的label设置样式的语句注释掉):

with open("QObject.qss", "r", encoding='utf-8') as f:
    qApp.setStyleSheet(f.read())

  • 1
  • 2
  • 3

  效果图如下:
在这里插入图片描述

  但是我们发现所有的label标签都设置上了样式,如果我们某个标签不想设置样式那应该怎么办呢?现在就轮到对象名称出马了,之前说过对象名称就像是对象ID,相当于css中的ID选择器,这下大家应该懂了,我们将qss样式表设置成只有ID为notice的label标签才能使用,然后给label加上notice名称,代码如下:

# -*- coding: UTF-8 -*-
"""
@Date   :2023/4/22
"""
from PyQt5.Qt import *


class Window(QWidget):  # 创建一个类,并且继承QWidget这个父类,用来自定义样式
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法(因为子类重写了init方法,所以父类的被隐藏了,需要显示调用)
        self.setWindowTitle("QObject的学习")  # 设置子类的标题
        self.resize(500, 500)  # 设置子类的窗口大小
        self.setup_ui()

    def setup_ui(self):  # 增加子控件
        # self.QObject继承结构测试()
        self.QObject对象名称和属性的操作()

    def QObject对象名称和属性的操作(self):
        # **********************案例演示***************************开始

        # 读取qss样式表,设置在全局qApp对象中(虽然该程序用的是app,但是设置在qApp中也能生效)
        with open("QObject.qss", "r", encoding='utf-8') as f:
            qApp.setStyleSheet(f.read())

        label = QLabel(self)
        label.setObjectName("notice")
        label.setText("社会我唐哥")

        label2 = QLabel(self)
        label2.setText("人狠话不多")
        label2.move(200, 200)

        label3 = QLabel(self)
        label3.setText("xxxx")
        label3.move(50, 50)

        label4 = QLabel(self)
        label4.setText("ooooo")
        label4.move(300, 300)


if __name__ == '__main__':  # 只有右键启动才会执行该方法,被人调用Menu模块的话,不会执行该方法,方便编写人员测试使用
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
QLabel#notice{
    font-size: 20px;
    color: red;
}
  • 1
  • 2
  • 3
  • 4

  效果图如下:
在这里插入图片描述

  现在只有label才会改变样式。

  除了用对象名称来控制样式具体应用在哪个控件上之外,还可以用属性名称来控制,qss代码如下:

/*只有id(ObjectName)为notice的QLabel组件才能生效*/
QLabel#notice {
    font-size: 20px;
    color: gray;
    border: 1px solid gray;
    border-radius: 8px;
}

/*只有id(ObjectName)为notice,并且属性值为notice_level="normal"的QLabel组件才能生效*/
QLabel#notice[notice_level="normal"] {
    color: green;
    border-color: green;
}

QLabel#notice[notice_level="warning"] {
    color: yellow;
    border-color: yellow;
}

QLabel#notice[notice_level="error"] {
    color: red;
    border-color: red;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

  程序代码如下:

# -*- coding: UTF-8 -*-
"""
@Date   :2023/4/22
"""
from PyQt5.Qt import *


class Window(QWidget):  # 创建一个类,并且继承QWidget这个父类,用来自定义样式
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法(因为子类重写了init方法,所以父类的被隐藏了,需要显示调用)
        self.setWindowTitle("QObject的学习")  # 设置子类的标题
        self.resize(500, 500)  # 设置子类的窗口大小
        self.setup_ui()

    def setup_ui(self):  # 增加子控件
        self.QObject对象名称和属性的操作()

    def QObject对象名称和属性的操作(self):
        # **********************案例演示***************************开始

        # 读取qss样式表,设置在全局qApp对象中(虽然该程序用的是app,但是设置在qApp中也能生效)
        with open("QObject.qss", "r", encoding='utf-8') as f:
            qApp.setStyleSheet(f.read())

        label = QLabel(self)
        label.setObjectName("notice")
        label.setProperty("notice_level", "warning")
        label.setText("社会我唐哥")

        label2 = QLabel(self)
        label2.setObjectName("notice")
        label2.setText("人狠话不多")
        label2.move(200, 200)

        label3 = QLabel(self)
        label3.setObjectName("notice")
        label3.setProperty("notice_level", "normal")
        label3.setText("xxxx")
        label3.move(50, 50)

        label4 = QLabel(self)
        label4.setObjectName("notice")
        label4.setProperty("notice_level", "error")
        label4.setText("ooooo")
        label4.move(300, 300)

        # 设置控件样式
        # label.setStyleSheet("font-size: 20px; color: red;")
        # *************************************************结束


if __name__ == '__main__':  # 只有右键启动才会执行该方法,被人调用Menu模块的话,不会执行该方法,方便编写人员测试使用
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

  效果如下:
在这里插入图片描述

  所以对象名称和属性值的具体应用主要是用在控制qss样式表上。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/930897
推荐阅读
  

闽ICP备14008679号