一、第一个pyqt程序
类的写法:
二、模块介绍
- PyQt官网的所有模块
- C++具体实现的API文档
- 思维导图:
链接:https://pan.baidu.com/s/1Gs-OUAAGMMH5dWVMhUrBEQ
提取码:gc9m
三、控件
3.1 QPushbutton,QRadioButton,QGroupBox
3.2 Qlable
3.3 QLineEdit
3.4 窗口调整
四、布局
4.1 QBoxLayout
QVBoxLayout
QHBoxLayout
4.2 QGridLayout
4.3 QFormLayout
表单提交
4.4 QStackedLayout
抽屉布局:提供了多页面切换的布局,一次只能看到一个界面
五、窗口
5.1 分类
六、信号与槽
6.1 介绍
6.2 案例一:clicked
6.3 案例二:自定义信号
6.4 案例三:模拟消息发送
6.5 信号与槽注意事项
是信号(Signal)和槽(Slot)主要是用于窗体间通讯,想要执行异步操作还需要多线程。
信号的对象不需要知道有几个槽函数,也不需要关系是否收到信号,或者谁收到了,谁没收到。同样的槽函数也不需要知道谁是信号的发出者。信号只需要在合适的时机发出即可,降低了对象之间的耦合度。
注意:
1、一个信号可以连接到多个槽:
connect(sender, SIGNAL(mySignal(int)),receiver1, SLOT(mySlot(int)));
connect(sender, SIGNAL(mySignal(int),receiver2, SLOT(mySlot(int)));
当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。
2、多个信号可以连接到同一个槽
connect(sender1 SIGNAL(mySignal1()), receiver, SLOT(mySlot()));
connect(sender2, SIGNAL(mySignal2()),receiver, SLOT(mySlot()));
任何一个信号发出,槽函数都会执行。
3、一个信号可以和另一个信号相连
connect(sender, SIGNAL(mySignal1()),this, SIGNAL(mySignal2()));
第一个信号发出后,第二个信号也同时发送。除此之外,信号与信号的连接和信号与槽连接相同。
4、连接可以被删除
disconnect(sender, SIGNAL(mySignal()),receiver, SLOT(mySlot()));
这个函数很少使用,因为当一个对象被删除后,Qt自动删除这个对象的所有连接。
5、参数设置
信号和槽函数必须有着相同的参数类型及顺序,这样信号和槽函数才能成功连接:
connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int, const QString &)));
如果信号里的参数个数多于槽函数的参数,多余的参数被忽略:
connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int)));
可以使用json,在定义信号时,将参数类型定义为str,emit函数时传入json.dumps(字典),这样不论是多少个参数都能传递到信号,信号调用槽函数时,json.loads(str)就可以得到参
startsignal = pyqtsignal(str);
self.btn.emit(json.dumps({"user":username,"pwd":password}));
def run(str){
params = json.loads(str);
username = params.get("user");
password = params.get("pwd");
}
6、获得对象
QObject * QObject::sender () const [protected]
sender () 函数返回 信号发出者 的 QObject型指针。
对QObject型指针进行强制转换得到需要的。
在槽函数里使用得到信号发送对象。
例如:
mySlot(){
currentGlWidget = qobject_cast<GLWidget *>(sender());
QPushButton* btn= dynamic_cast<QPushButton*>(sender())
}
带返回值的信号槽,槽函数有返回值
可通过
value = emit mysignal()
得到返回值。
七、Qt Designer
7.1 动态加载ui
.ui -》uic.loadUi()
7.2 获取控件
方便对控件绑定槽函数
八、多线程
只要是带界面的程序,一般来说程序运行后,会用当前线程进行事件的检查,按钮等图形界面的更新操作,如果在执行某个逻辑代码时,耗时严重就会出现界面卡顿。
所以一般将界面的显示用主线程来操作,逻辑功能代码或者耗时操作的代码都用另外线程处理。
8.1 多线程示例
8.2 多个线程之间信号传递
连接云函数
子线程发送显示信号给主界面线程
信号在界面类中创建,连接,槽函数
子线程如何知道界面线程的信号?创建子线程对象时当参数传入线程类。