【PyQt】QObject

2019-05-24  本文已影响0人  4thirteen2one

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

方法

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

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

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())

父子对象的操作

obj1 = QObject()
obj2 = QObject()
print("obj1", obj1)
print("obj2", obj2)

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

Qt 内存管理机制

显示关系

类型判定

多用于对控件进行过滤

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

对象删除

  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())
# 显示顺序相反
上一篇 下一篇

猜你喜欢

热点阅读