精彩文章免费看

【PyQt】QObject

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

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

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

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

  • 字体大小25px,颜色为灰色,边框圆角为8px
  • 信息提示分多个级别
  • 正常(normal):绿色边框,绿色字体
  • 警告(warning):黄色边框,黄色字体
  • 错误(error):红色边框,红色字体
  • 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:只查找直接子对象
    for widget in self.children():
        if widget.inherits("QLabel"):
            widget.getStyleSheet("background-color:cyan;")
    deleteLater():删除一个对象时,也解除其与父对象之间的关系
    并不是立即销毁,而是向主消息循环发送一个event,下一次主消息循环接收到该event后才销毁对象
    可以在这段延迟删除的时间内完成一些别的操作;但坏处是内存释放会不及时
  • 三者都会被打印
  • 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被释放"))
    
  • 三者都不会被打印
  • 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被释放"))
    
  • 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())
    # 显示顺序相反