美文网首页
【PyQt】QObject

【PyQt】QObject

作者: 4thirteen2one | 来源:发表于2019-05-24 00:54 被阅读0次

[TOC]
对象名称与属性、父子对象操作、信号处理、类型判定、对象删除、事件处理、定时器、语言翻译

方法

  • setObjectName("对象名称"):给 Qt 对象设置唯一名称,等效于ID
  • objectName():获取该 Qt 对象的名称
  • setProperty("属性名称", 值):给一个 Qt 对象动态地添加一个属性与值
  • property("属性名称"):获取 Qt 对象的属性值
  • dynamicPropertyName():获取对象中所有通过 setProperty 设置的属性

以上方法可用于 qss 的 ID 选择器、属性选择器,方便统一设置样式
也可用于装饰器的信号与槽

用例:创建多个用于信息提示的QLabel

  • 要求:
    • 字体大小25px,颜色为灰色,边框圆角为8px
    • 信息提示分多个级别
      • 正常(normal):绿色边框,绿色字体
      • 警告(warning):黄色边框,黄色字体
      • 错误(error):红色边框,红色字体
  • 涉及:
    • 对象名/属性设置
    • 文件读取
    • qss样式表
label = QLabel(self)
label.setText("hello world")
label.setStyleSheet("font-size:20px; color: red;")

或者另建一个 qss 文件,存储样式设置信息

QLabel {
    font-size:20px; color: red;
}

打开并读取 qss 文件

with open("QObject.qss", "r") as f:
    qApp.setStyleSheet(f.read())

为特定标签应用样式(以 ID 为参考)

label1 = QLabel(self)
label1.setText("hello")

label2 = QLabel(self)
label2.move(100, 100)
label2.setText("world")

with open("QObject.qss", "r") as f:
    qApp.setStyleSheet(f.read())

qss 内容:

QLabel#one {
    font-size:20px; color: red;
}

根据属性设置不同样式

QLabel#notice {
    font-size: 20px;
    color: gray;
    border: 1px solid gray;
    border-radius: 8px;
}

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: error;
    border-color: error;
}

内容

label1 = QLabel(self)
label1.setObjectName("notice")
label1.setProperty("notice_level", "normal")
label1.setText("hello")

label2 = QLabel(self)
label2.setObjectName("notice")
label2.setProperty("notice_level", "warning")
label2.move(100, 100)
label2.setText("world")

label3 = QLabel(self)
label3.setObjectName("notice")
label3.setProperty("notice_level", "error")
label3.move(200, 200)
label3.setText("!")

with open("QObject.qss", "r") as f:
    qApp.setStyleSheet(f.read())

父子对象的操作

  • setParent(parent):设置唯一父对象
    或者直接在创建控件时继承,如 label = QPushButton(window),其中 window = QWiget()
  • parent():获取父对象
  • children():获取所有直接子对象
  • findChild(参数1, 参数2, 参数3):只寻找一个
    • 参数1:类型或类型元组
    • 参数2:对象名称
    • 参数3:查找选项
      • Qt.FindChildrenRecursively:递归查找(默认)
      • Qt.FindDirectChildrenOnly:只查找直接子对象
  • findChildren(参数1, 参数2, 参数3):查找所有满足条件的子对象
obj1 = QObject()
obj2 = QObject()
print("obj1", obj1)
print("obj2", obj2)

obj1.setParent(obj2)
print(obj1.parent())

Qt 内存管理机制

  • 对象树:所有的对象都继承于 QObject
  • 若在某对象下创建了子对象,那么其 children() 列表中应该包含该子对象
  • 当父对象被销毁时,子对象也会被销毁

显示关系

  • 一个控件若没有任何父控件,则会被设置为顶层控件(窗口)
  • 若需一个控件被包含在另一控件内部,则需设置父子关系
  • 子控件的显示位置受父控件约束,生命周期也被其父对象接管

类型判定

  • isWidgetType()
  • inherits(父类):是否以某类型为父类

多用于对控件进行过滤

for widget in self.children():
    if widget.inherits("QLabel"):
        widget.getStyleSheet("background-color:cyan;")

对象删除

  • deleteLater():删除一个对象时,也解除其与父对象之间的关系
    并不是立即销毁,而是向主消息循环发送一个event,下一次主消息循环接收到该event后才销毁对象
    可以在这段延迟删除的时间内完成一些别的操作;但坏处是内存释放会不及时
  1. 三者都会被打印
obj1 = QObject()
obj2 = QObject()
obj3 = QObject()

obj3.setParent(obj2)
obj2.setParent(obj1)

obj1.destroyed.connect(lambda: print("obj1被释放"))
obj2.destroyed.connect(lambda: print("obj2被释放"))
obj3.destroyed.connect(lambda: print("obj3被释放"))
  1. 三者都不会被打印
obj1 = QObject()
self.obj1 = obj1
obj2 = QObject()
obj3 = QObject()

obj3.setParent(obj2)
obj2.setParent(obj1)

# del obj2     # 在此处添加这么一句也不会有任何打印
obj1.destroyed.connect(lambda: print("obj1被释放"))
obj2.destroyed.connect(lambda: print("obj2被释放"))
obj3.destroyed.connect(lambda: print("obj3被释放"))
  1. 2和3 被打印
obj1 = QObject()
self.obj1 = obj1
obj2 = QObject()
obj3 = QObject()

obj3.setParent(obj2)
obj2.setParent(obj1)

obj1.destroyed.connect(lambda: print("obj1被释放"))
obj2.destroyed.connect(lambda: print("obj2被释放"))
obj3.destroyed.connect(lambda: print("obj3被释放"))

obj2.deleteLater()
print(obj1.children())
# 显示顺序相反

相关文章

  • 【PyQt】QObject

    [TOC]对象名称与属性、父子对象操作、信号处理、类型判定、对象删除、事件处理、定时器、语言翻译 方法 setOb...

  • PyQt(三) 类继承结构图

    一. PyQt5 类的继承结构图 二. 如何获取一个类的父类和子类? 使用QObject.mro()获取父类, 使...

  • PyQt5 Emitting signals(QObject类的

    重点是QObject类的实例化对象可以发出信号,然后pyqtSignal类的实例化可以创建一个新的信号类型。 代码...

  • Qobject

    学习说明 Qobejct 这个类基本是所有控件的基类,所以先学习该控件的操作和对应的api,则在后续学习中就可以使...

  • QT Model 继承关系

    QObject|QAbstractItemModel — — — — — — — — — — — — — —|||...

  • QObject三大核心功能——内存管理

    信号与槽,内存管理,事件处理 QObject的parent or 对象树(Object Tree) QObject...

  • 用QObject实现多线程

    用QObject实现多线程(好处,自带事件循环)1、Worker继承QObject,实现工作函数并把其作为publ...

  • QObject类

    徐红伟@百香果科技 QObject类是所有Qt对象的基类。是Qt对象模型的基础。 Signals和Slots机制 ...

  • QT5编程系列 (1)Q_OBJECT

    只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObjec...

  • PyQt5自学攻略

    PyQt5简介 PyQt是QT框架的Python语言实现,存在有PyQt3,PyQt4,PyQt5三个版本。PyQ...

网友评论

      本文标题:【PyQt】QObject

      本文链接:https://www.haomeiwen.com/subject/hzpizqtx.html