一、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_())
具体效果如下:
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_())
具体效果如下:
二、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_())
效果如下:
接着我们加一句qss代码,给label
设置一下字体大小和颜色,代码如下:
# 设置控件样式
label.setStyleSheet("font-size: 20px; color: red;")
效果图如下:
我们这是在程序代码里面直接设置样式,这样的话耦合性太高, 我们可以用一个文件来写qss代码,然后程序中读取该文件内容即可降低耦合性,创建一个QObject.qss
文件,qss代码如下:
/*对所有QLabel组件都生效生效*/
QLabel{
font-size: 20px;
color: red;
}
读取qss文件的代码如下(因为可能全局都会使用,所以我们直接用qApp设置,但是也可以用局部app设置,看自己需要,记得把原来的label设置样式的语句注释掉):
with open("QObject.qss", "r", encoding='utf-8') as f:
qApp.setStyleSheet(f.read())
效果图如下:
但是我们发现所有的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_())
QLabel#notice{
font-size: 20px;
color: red;
}
效果图如下:
现在只有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;
}
程序代码如下:
# -*- 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_())
效果如下:
所以对象名称和属性值的具体应用主要是用在控制qss样式表上。