一、基本思路结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from PyQt5.Qt import * import sys
app = QApplication(sys.argv) app.arguments() qApp.arguments()
app.exec_()
|
二、第一个PyQt5程序:hello world
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from PyQt5.Qt import * import sys
app = QApplication(sys.argv)
window = QWidget() window.setWindowTitle("微博搜索助手") window.resize(500,500) window.move(400,200)
label = QLabel(window) label.setText("hello world") label.move(200,200)
window.show() sys.exit(app.exec_())
|
封装成面向对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from PyQt5.Qt import *
class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("学习入门") self.resize(500,500) self.setup_ui()
def setup_ui(self): pass
if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
|
设置控件样式:
1 2 3 4 5 6 7 8 9 10 11
| def setup_ui(self): with open("QLabel.qss",'r') as f: qApp.setStyleSheet(f.read())
label = QLabel(self) label.setObjectName("labelStyle") label.setProperty("notice_level","warning") label.setText("文本设置样式")
|
外部样式文件QLabel.qss:
1 2 3 4 5 6 7 8
| QLabel#labelStyle { font-size:20; color:yellow; } QLabel#labelStyle[notice_level="warning"] { font-size:40px; color:red; }
|
设置控件的父子关系:
1 2 3 4 5 6 7 8
| obj1 = QObject() obj2 = QObject() obj1.setParent(obj2) obj1.parent() obj2.children()
obj1.findChild(参数1,参数2,参数3) obj1.findChildren(参数1,参数2,参数3)
|
内存管理机制:
所有的对象都是直接或者间接的继承QObject
QObject在一个对象树中组织,当创建一个QObject时,如果使用了其他对象作为其父对象,那么他就会添加到父对象的children列表中
当父对象被销毁时,这么QObject对象就会被销毁,其所有子对象同时也会被销毁
子控件和父控件的关系:显示受父控件约束,父控件销毁子控件也会销毁
如果两个控件都没有父控件,那么都会当做单独的顶级控件显示;
只有顶级控件才能设置标题栏等属性信息;
信号与槽机制:
基本概念:
信号(Signal)和槽(slot)是Qt中的核心机制,主要用于对象之间进行通讯
信号:当一个控件的状态发生改变时,向外界发出的信息
槽:一个执行某些操作的函数或方法
所有继承自QWidget的控件都支持信号与槽机制
信号:
控件内置的一些 QPushButton().pressed/clicked
也可以自定义信号:
槽:
不同控件内置的槽函数
自定义的函数方法
连接方式:
object.信号.connect(槽函数)
特性:
一个信号可以连接多个槽函数
一个信号也可以连接多个槽函数
信号的参数可以使任何python类型
一个槽可以监听多个信号
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 38 39
| obj = QObject() obj.destroyed.connect(lambda :print("对象已被销毁"))
def change(name): print("名称发生改变",name) obj.objectNameChanged.connect(change) obj.setObjectName("名称修改")
def change(name): print("名称发生改变",name) obj.objectNameChanged.connect(change) obj.setObjectName("名称修改1") obj.objectNameChanged.disconnect() obj.setObjectName("名称修改2")
obj = QObject() def change(name): print("名称发生改变",name) obj.objectNameChanged.connect(change) obj.setObjectName("名称修改1") obj.blockSignals(True) obj.setObjectName("名称修改2") obj.blockSignals(False) obj.setObjectName("名称修改3") obj.SignalsBlocked() obj.obj.receivers(obj.objectNameChanged)
|
QObject 类型判定
1 2 3 4 5 6 7 8 9 10 11 12 13
| obj = QObject() w = QWidget() btn = QPushButton() label = QLabel() objs = [obj,w,btn,label] for o in objs: print(o.isWidgetType()) # 是否是控件类型 # print(o.inherits('QWidget'))# 是否是控件类型 # output: # False # True # True # True
|
对象删除 obj.deleteLater():
- 删除一个对象时,也会接触它与父对象之间的关系
- 并没有将对象立即销毁,而是向主消息循环发送了一个event,下次主循环循环收到这个event之后才会销毁对象
- 这样做额好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时
应用场景:想要移除某个对象时候使用
定时器
1 2 3 4 5 6 7
| class MyObject(QObject): def timerEvent(self,evt): print(evt,"1")
obj = MyObject() timer_id = obj.startTimer(1000) # 开启定时器 obj.killTimer(timer_id) # 删除定时器
|