当前位置:   article > 正文

Python桌面开发pyqt5—QObject_python blocksignals

python blocksignals

属性设置

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

# 属性
obj.setProperty('!', '!')  # 设置属性
obj.setProperty('notice', 'error')  # 属性可设置多个
print(obj.property('notice'))  # 获取属性
print(obj.dynamicPropertyNames())  # 获取所有属性的名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

QWidget的方法

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

判断类型

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;')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

父子关系

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))	# 所有子孙对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

删除对象

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

信号与槽

示例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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

示例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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

事件处理机制

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

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_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/816759
推荐阅读
相关标签
  

闽ICP备14008679号