QObject是所有的Qt对象的基类
# 给一个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;
}
"""
# 设置父对象
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_())
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_())
# 判断是否是控件类型(继承自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_())
# 删除一个对象
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_())
信号与槽机制是对事件机制的高级封装
# 常用API
childEvent()
customEvent()
eventFilter()
installEventFilter()
removeEventFilter
event()
# 开启定时器
# 第一个参数为定时器的时间,
# 第二个参数为定时器的类型: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_())