pyqt5学习之object 1.object继承的父类 2.对象的名称和属性设置 3.Qobject信号与槽的应用 4.PYQT事件机制 5.定时器使用
主要记录object的一些属性应用
# -*- coding: utf-8 -*- from PyQt5.Qt import * class Window(QWidget): def __init__(self): super(Window, self).__init__() self.resize(500,500) self.setWindowTitle('QObject学习') self.setup_ui() def setup_ui(self): self.QObjectj继承结构测试() def QObjectj继承结构测试(self): mros = QObject.mro() for mro in mros: print(mro) if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
结果为:<class 'PyQt5.QtCore.QObject'>;<class 'sip.wrapper'>;
<class 'object'>
2.对象的名称和属性设置
主要应用场景:用于QSS的ID选择器,属性选择器;用于装饰器的信号与槽
# -*- coding: utf-8 -*- from PyQt5.Qt import * class Window(QWidget): def __init__(self): super(Window, self).__init__() self.resize(500,500) self.setWindowTitle('QObject学习') self.setup_ui() def setup_ui(self): self.QObjectj对象名称和属性的操作() def QObjectj对象名称和属性的操作(self): obj = QObject() obj.setObjectName('notice') # 给一个QT对象设置一个名称,当做对象的ID使用 print(obj.objectName()) # 获取一个qt对象的ID名称 obj.setProperty('notice_level','error') # 给一个QT对象动态的添加一个属性与值 obj.setProperty('notice_level2','warning') print(obj.property('notice_level')) # 获取一个对象的属性值 print(obj.dynamicPropertyNames()) # 获取一个对象所有通过setProerty设置的属性名称 if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
案例:
# -*- coding: utf-8 -*- from PyQt5.Qt import * class Window(QWidget): def __init__(self): super(Window, self).__init__() self.resize(500,500) self.setWindowTitle('QObject学习') self.setup_ui() def setup_ui(self): self.QObjectj对象名称和属性的操作() def QObjectj对象名称和属性的操作(self): # 设置控件样式种方法 # 1.通过QSS文件 # 2.通过控件.setStyleSheet命令设置样式 #本文通过法一QSS文件设置样式 with open('Object.qss','r') as f: qApp.setStyleSheet(f.read()) label = QLabel(self) label.setObjectName('notice') # 设置ID label.setProperty('notice_level','warning') # 设置属性 label.setText('学习') label2 = QLabel(self) label2.move(200,200) label2.setObjectName('notice') # 设置ID label2.setProperty('notice_level2', 'warning') # 设置属性 label2.setText('学习') btn = QPushButton(self) btn.setObjectName('notice') btn.setText('按钮') btn.move(50,50) if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
QSS文件
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; }
3.Qobject信号与槽的应用
# -*- coding: utf-8 -*- from PyQt5.Qt import * class Window(QWidget): def __init__(self): super(Window, self).__init__() self.resize(500,500) self.setWindowTitle('QObject学习') self.setup_ui() def setup_ui(self): self.QObjectj信号与槽() def QObjectj信号与槽(self): # QObject有两个信号 #1.destroyed #2.objectNameChanged self.obj = QObject() def destroy_cao(obj): print("对象被释放了") self.obj.destroyed.connect(destroy_cao) del self.obj if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
# -*- coding: utf-8 -*- from PyQt5.Qt import * class Window(QWidget): def __init__(self): super(Window, self).__init__() self.resize(500,500) self.setWindowTitle('QObject学习') self.setup_ui() def setup_ui(self): self.QObjectj信号与槽() def QObjectj信号与槽(self): # QObject有两个信号 #2.objectNameChanged self.obj = QObject() def obj_name_cao(name): print('对象名称发生了改变') self.obj.objectNameChanged.connect(obj_name_cao) self.obj.setObjectName('xxx') if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
4.PYQT事件机制
import sys from PyQt5.Qt import * # 该为事件机制第一级 class App(QApplication): def notify(self,recevier,evt): if recevier.inherits('QPushButton') and evt.type() == QEvent.MouseButtonPress: print(recevier,evt) # 上述两行代码为子类截取事件,自定义事件 return super().notify(recevier, evt) # 一定要有该行否则程序崩溃,因为子类定义了notify方法缺少其他运行机制需要继承父类 # 该为事件机制第二级 class Btn(QPushButton): def event(self,evt): if evt.type() == QEvent.MouseButtonPress: print(evt) return super().event(evt) # 该为事件机制第三级 def mousePressEvent(self, *args, **kwargs): print("鼠标被按下了......") # 事件机制最后一级,自定义槽信息,屏蔽自己定义的槽函数 return super().mousePressEvent(*args, **kwargs)#改代码实现自己定义槽函数实现 app = App(sys.argv) window = QWidget() btn = Btn(window) btn.setText('按钮') btn.move(100,100) def cao(): print('按钮被点击了') btn.pressed.connect(cao) window.show() sys.exit(app.exec_())
5.定时器使用
from PyQt5.Qt import * import sys class mylabel(QLabel): def __init__(self, *args, **kwargs): super(mylabel, self).__init__(*args, **kwargs) # 必须要继承父类,因为自己定义的子类不全,*args, **kwargs方便不定参数传值避免出错 self.setText('10') self.move(100,100) self.setStyleSheet('font-size: 22px;') def setSec(self, sec): self.setText(str(sec)) def startmytimer(self, ms): self.timer_id = self.startTimer(ms ,Qt.PreciseTimer) #timer_id获取定时器唯一标识,startTimer设定一个时间,间隔设定时间运行程序 def timerEvent(self, *args, **kwargs): # 利用该事件机制可以 print('事件机制') current_sec = int(self.text()) current_sec -= 1 self.setText(str(current_sec)) if current_sec == 0: print("停止") self.killTimer(self.timer_id) #利用killTimer根据timer_id杀死定时器 app = QApplication(sys.argv) window = QWidget() window.setWindowTitle('QObject定时器的使用') window.resize(500,500) label = mylabel(window) label.setSec(5) label.startmytimer(500) window.show() sys.exit(app.exec_())