PyQt5之QObject

一、QObject

1.描述

QObject是所有的Qt对象的基类

2.功能作用

(1) 对象名称,属性

# 给一个Qt对象设置一个名称,一般这个名称是唯一的,当做对象的ID来使用
setObjectName("唯一名称")

# 获取一个Qt对象的名称
objectName() 

# 给一个Qt对象动态的添加一个属性与值
setProperty("属性名称",值) 

# 获取一个对象的属性值
property("属性名称") 

# 获取一个对象中所有通过setProperty()设置的属性名称
dynamicPropertyNames() 

案例

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject学习") # 设置窗口标题
        self.resize(500, 500) # 设置窗口大小
        self.demo()
    
    def demo(self):
        with open("demo.css", "r") as f:
            qApp.setStyleSheet(f.read()) # 获取样式表

        label1 = QLabel(self) # 定义一个label
        label1.move(100, 0)
        label1.setText("正常") # 设置label的文字
        label1.setObjectName("notice") # 设置名称
        label1.setProperty("notice_level", "normal") # 添加属性

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

        label3 = QLabel(self)
        label3.move(100, 100)
        label3.setText("错误")
        label3.setObjectName("notice")
        label3.setProperty("notice_level", "error")


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
    
"""
	demo.css文件
	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: red;
        border-color: red;
    }
"""

(2) 父子对象的操作

# 设置父对象
setParent(parent) 

# 获取父对象
parent() 

# 获取所有子对象
children() 

# 获取某个指定名称和类型的子对象
# 参数1 类型:QObject 
# 参数2 名称,可以省略
# 参数3 查找选项: Qt.FindChildrenRecursively(递归查找)/Qt.FindDirectChildrenOnly(只查找子对象)
findChild(参数1, 参数2, 参数3) 

# 获取某多个指定名称和类型的子对象
# 参数1 类型:QObject 
# 参数2 名称,可以省略
# 参数3 查找选项: Qt.FindChildrenRecursively(递归查找)/Qt.FindDirectChildrenOnly(只查找子对象)
findChildren(参数1, 参数2, 参数3)

案例

# 当两个窗口没有关系时,会产生两个窗口
from PyQt5.Qt import *

import sys
if __name__ == '__main__':
    
    app = QApplication(sys.argv)

    win1 = QWidget()
    win1.setWindowTitle("红色")
    win1.resize(500, 500)
    win1.setStyleSheet("background-color: red;")
    win1.show()

    win2 = QWidget()
    win2.setWindowTitle("绿色")
    win2.resize(500, 500)
    win2.setStyleSheet("background-color: green;")
    win2.show()
    sys.exit(app.exec_())
# 当将窗口2的的父对象设为窗口1时,只有一个窗口
from PyQt5.Qt import *

import sys
if __name__ == '__main__':
    
    app = QApplication(sys.argv)

    win1 = QWidget()
    win1.setWindowTitle("红色")
    win1.resize(500, 500)
    win1.setStyleSheet("background-color: red;")
    win1.show()

    win2 = QWidget()
    win2.setWindowTitle("绿色")
    win2.resize(500, 500)
    win2.setStyleSheet("background-color: green;")
    win2.setParent(win1)
    win2.show()

    sys.exit(app.exec_())

(3) 信号处理

widget.信号.connect() # 为信号绑定槽
obj.disconnect() # 取消信号与槽的绑定
widget.blockSignals(bool) # 临时(取消)阻止指定控件所有的信号与槽的连接
widget.signalsBlocked() # 获取信号是否被阻止
widget.receivers(信号) # 返回连接到信号的接收器数量

# 两个信号
# 1.对象名称发生改变时发射此信号
objectNameChanged(objectName)
# 2.对象被销毁时, 发射此信号
destroyed(obj)

案例

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject的学习")
        self.resize(500, 500)
        self.demo()

    def demo(self):

        btn = QPushButton(self)
        btn.setText("点击我")
        def cao():
            print("你干嘛?")
        
        btn.clicked.connect(cao) # 为按钮添加点击信号

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())
# 为所有打开的窗口名称前加上QT
from PyQt5.Qt import *

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = QWidget()


    def changeTitle(title):
        # 方法1 取消连接这重连
        # window.windowTitleChanged.disconnect()
        # window.setWindowTitle("QT" + title)
        # window.windowTitleChanged.connect(changeTitle)

        # 方法2 暂时阻止
        window.blockSignals(True)
        window.setWindowTitle("QT " + title)
        window.blockSignals(False)

    window.windowTitleChanged.connect(changeTitle)

    window.setWindowTitle("hello QT")
    window.show()

    sys.exit(app.exec_())

(4) 类型判定

# 判断是否是控件类型(继承自QWidget类的)
isWidgetType()
# 一个对象是否继承(直接或者间接)自某个类
inherits(父类)

案例

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject学习")  # 设置窗口标题
        self.resize(500, 500)  # 设置窗口大小
        self.demo()

    def demo(self):
        label1 = QLabel(self)
        label1.move(100, 0)
        label1.setText("我想学QT")

        label2 = QLabel(self)
        label2.move(100, 50)
        label2.setText("学不会QT")

        btn = QPushButton(self)
        btn.move(100, 100)
        btn.setText("别碰我")

        for widget in self.children():
            #  if widget.isWidgetType():
            if widget.inherits("QLabel"):
                widget.setStyleSheet("background-color: red")

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()

    window.show()

    sys.exit(app.exec_())

(5) 对象删除

# 删除一个对象
obj.deleteLater()

案例

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject学习")  # 设置窗口标题
        self.resize(500, 500)  # 设置窗口大小
        self.demo()

    def demo(self):
        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被释放"))

        """
            观察输出结果,我们发现:
                deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,
                下一次主消息循环收到这个event之后才会销毁对象
        """
        obj2.deleteLater()
        print(obj1.children())


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()

    window.show()

    sys.exit(app.exec_())

(6) 事件处理

信号与槽机制是对事件机制的高级封装

# 常用API
childEvent()
customEvent()
eventFilter()
installEventFilter()
removeEventFilter
event()

(7) 定时器

# 开启定时器
# 第一个参数为定时器的时间,
# 第二个参数为定时器的类型:Qt.PreciseTimer(尽可能保持毫秒准确) Qt.CoarseTimer(5%的误差间隔)    Qt.VeryCoarseTimer(能到秒级)
# 返回值 timer_id 是定时器的唯一标识
startTimer(ms, Qt.TimerType)

# 根据定时器ID,杀死定时器
killTimer(timer_id)

# 定时器执行事件
timerEvent()
# 倒计时案例

from PyQt5.Qt import *
import sys


class MyObject(QObject):
    def timerEvent(self, evt):
        print(evt, "1")


class MyLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setText("10")
        self.move(200, 150)
        self.setStyleSheet("font-size: 100px;")
        self.timer = self.startTimer(1000)

    def timerEvent(self, evt):

        num = int(self.text())
        self.setText(str(num - 1))
        if num - 1 == 0:
            self.killTimer(self.timer)

app = QApplication(sys.argv)

window = QWidget()

window.setWindowTitle("定时器的使用")
window.resize(500, 500)

label = MyLabel(window)

window.show()

sys.exit(app.exec_())

你可能感兴趣的:(qt,qt,开发语言)