QObject 类型判定
作用:作为控件过滤器使用筛选出要进行操作的控件。
- 比如要设置所有按钮的格式,那么可以使用 for 循环遍历,当控件继承自 QPushBotton 类时进行设置。
判定是否为控件类型
obj.isWidgetType()
比如 QObject 类型的对象就不是控件类型,而如按钮、标签等就是控件类型
判定某个类是否继承自某个类(直接继承 / 间接继承)
obj.inherits("父类名")
QObject 对象的删除
关于 Python 对象的内存管理机制
- 参考文章:
如何在Python中删除一个对象 - 简单来说,在 Python 中,当一个对象被引用时(比如 obj1 = obj0)(Python 中变量的传递都是按引用传递的),他的引用次数就会增加一,当引用次数为 1 时,使用 del obj0 便可以删除 obj0,但是当引用次数大于1时,使用 del obj0 只是删除 obj0 这个标识符与内存中对象的联系,同时对象的被引用次数减 1,并不调用该对象的析构函数。
obj0 = object() # 创建一个对象,为 obj0 引用,此时引用次数为1
obj1 = obj0 # 引用 obj0,此时引用次数为2
del obj0 # 并不会删除内存中的对象,删除 obj0 这个标识符与内存中存储的 object 对象的联系而已,此时引用次数减为 1
del obj1 # 引用次数为 1,再 del 时真正删除内存中的 object 对象,调用析构函数
使用 deleteLater() 方法删除 QObject 对象
作用:
删除一个对象时,同时解除它和父对象的关系(如被引用关系)。
- 注意:使用这个方法时并不立即销毁对象,而是向主消息循环发送一个 event,下一次主消息循环收到这个 event 之后才会销毁对象。
- 好处:在延迟删除的时间里进行一些操作
- 坏处:内存释放不及时
事件
信号是对事件的封装,内置了许多种信号,事件更贴近底层。
当要使用的触发信号在内置类型中找不到时,可以通过接收事件进行处理。
定时器
obj.startTimer
1.参数一:触发间隔 / ms
2.参数二:定时器类型
- 返回值:定时器 id
def timerEvent(self, evt):
定时器中断回调函数。
obj.killTimer(timer_id)
关闭定时器,参数为定时器 id。
示例代码
初步使用
import sys
from PyQt5.Qt import *
# 重写类,重写中断回调函数
class MyObject(QObject):
def timerEvent(self, evt): # 定时器中断回调
print("1s")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("定时器")
window.resize(500, 500)
window.move(400, 200)
obj = MyObject()
timer_id = obj.startTimer(1000)
window.show()
sys.exit(app.exec_())
倒计时显示
import sys
from PyQt5.Qt import *
class MyLabel(QLabel):
def __init__(self, *args, **kwargs): # *args, **kwargs 接收任何参数
super().__init__(*args, **kwargs)
self.setText("10")
self.move(100, 100)
self.timer_id = self.startTimer(1000) # 存储定时器 id
def timerEvent(self, evt): # 定时器中断回调
print("1s")
text = int(self.text()) - 1
if text == 0:
self.killTimer(self.timer_id)
self.setText(str(text))
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("定时器")
window.resize(500, 500)
window.move(400, 200)
label = MyLabel(window)
window.show()
sys.exit(app.exec_())