Python桌面开发pyqt5—QObject

属性设置

# 下面所有demo写在这里
obj = QObject()
# 名称
obj.setObjectName("object")  # 设置
print(obj.objectName())  # 获取

# 属性
obj.setProperty('!', '!')  # 设置属性
obj.setProperty('notice', 'error')  # 属性可设置多个
print(obj.property('notice'))  # 获取属性
print(obj.dynamicPropertyNames())  # 获取所有属性的名

QWidget的方法

# 设置文本
obj.setText(text)
# 调整大小(可缩放)
obj.reisze(w,h)
# 设置固定大小(不可缩放)
obj.setFixedSize(w,h)
# 移动
obj.move(x,y)
# 禁用最大化、关闭按钮
obj.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) 

判断类型

obj = QObject()

# 判断是否为控件类别
print(obj.isWidgetType())	
# 判断是否继承自某一个类
print(obj.inherits('QWidget'))		# QWidget也继承自QWidget类

# 可根据inherits和isWidgetType以另一种思路设计控件的qss样式
for widget in self.children():
	if widget.inherits('QLabel'): # 若控件是QLabel类型,将文字变为blue
		widget.setStyleSheet('color:blue;')

父子关系

obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
obj3 = QObject()
obj4 = QObject()
obj5 = QObject()
obj5.setObjectName('obj5')

# 设置父对象
obj3.setParent(obj1)
obj4.setParent(obj2)
obj5.setParent(obj2)
obj1.setParent(obj0)
obj2.setParent(obj0)
print('obj4的parent:' , obj4.parent())	# 查找父对象
print('obj0的children:' , obj0.children())	# 查找所有直接子对象
print('obj0的findChild:' , obj0.findChild(QObject))
print('obj0的名字为"obj5"的findChild:',obj0.findChild(QObject,'obj5'))
print('obj0的findChildren:' , obj0.findChildren(QObject))	# 所有子孙对象

在这里插入图片描述

删除对象

self.obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
obj2.setParent(obj1)
obj1.setParent(self.obj0)
self.obj0.destroyed.connect(lambda: print('obj0被销毁'))
obj1.destroyed.connect(lambda: print('obj1被销毁'))
obj2.destroyed.connect(lambda: print('obj2被销毁'))

# del obj1  # obj1被obj2引用,通过这种方式删除不了
'''以后删除对象就要用deleLater(),对象不是立即删除,而是下一次循环之后才销毁,所以deleLater()下面的语句也会执行'''
# 释放的时候,会解除对象父子关系,也就是obj0,obj2不再是obj1的父子
obj1.deleteLater()
# 手动销毁父对象, 当父对象被销毁时子对象自动销毁
# del self.obj0

信号与槽

示例1

obj = QObject()

# 绑定事件
obj.destroyed.connect(lambda o: print(o, '对象已被销毁!!'))
obj.objectNameChanged.connect(lambda new_name: print('对象名称已改变,名称为:', new_name))
obj.objectNameChanged.connect(lambda new_name: print('绑定的第2个函数已被执行:', new_name))

# 发生事件
obj.setObjectName('root')
# 解绑,会触发事件,但与槽失去连接,不执行事件函数
obj.objectNameChanged.disconnect()
# 临时阻断信号连接
obj.blockSignals(True)
obj.setObjectName('obj1')
# 恢复信号连接
obj.blockSignals(False)
obj.setObjectName('obj2')
# 获取是否临时阻断了连接
print(obj.signalsBlocked())
# 获取某个信号连接了几个槽函数
print(obj.receivers(self.obj.objectNameChanged))

# 触发销毁事件 -> 这里会在obj.signalsBlocked()前执行, 抛出异常
del obj

示例2

# 每次修改主窗口标题都会显示'Hello-新标题'
def name_change_func(title):
	self.blockSignals(True)		# 暂时阻断信号,防止无限递归
	self.setWindowTitle('Hello,{}!'.format(title))
	self.blockSignals(False)	# 重连信号,保证修改多次title也可以正常实现功能
self.windowTitleChanged.connect(name_change_func)
self.setWindowTitle('lzc')
self.setWindowTitle('zs')

事件处理机制

事件处理机制相对于信号与槽,更加低级、偏向于底层

import sys

from PyQt5.Qt import QEvent, QObject
from PyQt5.QtWidgets import *

class MyApp(QApplication):
    def notify(self, receiver, evt):
        if evt.type() == QEvent.MouseButtonPress:
            print("receiver: {}, evt: {}".format(receiver, evt))
        return super().notify(receiver, evt)


class MyButton(QPushButton):
    def event(self, evet):
        if evet.type() == QEvent.MouseButtonPress:
            print(evet)
        return super().event(evet)

    def mousePressEvent(self, *args, **kwargs):
        print('鼠标在子函数中被按下...')
        return super().mousePressEvent(*args, **kwargs)


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

    root = QWidget()
    root.resize(500, 300)
    root.move(400, 400)

    btn = MyButton(root)
    btn.setText('按钮')
    btn.move(100, 100)
    btn.pressed.connect(lambda: print('按钮被点击了...'))

    root.show()
    sys.exit(app.exec_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值