赞
踩
简单介绍一下PyQt5最上层父类QObject
的一些属性方法,并给出具体的使用过程示例。
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_())
具体效果如下:
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对象名称和属性值的代码示例之后,可能大家还有些模糊,这两个东西到底有什么用?接着我们就用一个案例来告诉大家这用什么用!!
在进行案例之前,我们先来了解一下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样式表上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。