一文pyqt篇

目录

  • 一、第一个pyqt程序
  • 二、模块介绍
  • 三、控件
    • 3.1 QPushbutton,QRadioButton,QGroupBox
    • 3.2 Qlable
    • 3.3 QLineEdit
    • 3.4 窗口调整
  • 四、布局
    • 4.1 QBoxLayout
    • 4.2 QGridLayout
    • 4.3 QFormLayout
    • 4.4 QStackedLayout
  • 五、窗口
    • 5.1 分类
  • 六、信号与槽
    • 6.1 介绍
    • 6.2 案例一:clicked
    • 6.3 案例二:自定义信号
    • 6.4 案例三:模拟消息发送
    • 6.5 信号与槽注意事项
  • 七、Qt Designer
    • 7.1 动态加载ui
    • 7.2 获取控件
  • 八、多线程
    • 8.1 多线程示例
    • 8.2 多个线程之间信号传递

一、第一个pyqt程序

一文pyqt篇_第1张图片
类的写法:
一文pyqt篇_第2张图片

二、模块介绍

一文pyqt篇_第3张图片

  • PyQt官网的所有模块
  • C++具体实现的API文档
  • 思维导图:
    链接:https://pan.baidu.com/s/1Gs-OUAAGMMH5dWVMhUrBEQ
    提取码:gc9m

三、控件

3.1 QPushbutton,QRadioButton,QGroupBox

一文pyqt篇_第4张图片
一文pyqt篇_第5张图片

3.2 Qlable

一文pyqt篇_第6张图片

3.3 QLineEdit

一文pyqt篇_第7张图片

3.4 窗口调整

一文pyqt篇_第8张图片
一文pyqt篇_第9张图片
一文pyqt篇_第10张图片

四、布局

4.1 QBoxLayout

QVBoxLayout
一文pyqt篇_第11张图片
一文pyqt篇_第12张图片
QHBoxLayout
一文pyqt篇_第13张图片

4.2 QGridLayout

一文pyqt篇_第14张图片

4.3 QFormLayout

表单提交
在这里插入图片描述

4.4 QStackedLayout

抽屉布局:提供了多页面切换的布局,一次只能看到一个界面
一文pyqt篇_第15张图片
一文pyqt篇_第16张图片
一文pyqt篇_第17张图片
一文pyqt篇_第18张图片
一文pyqt篇_第19张图片
一文pyqt篇_第20张图片

五、窗口

5.1 分类

一文pyqt篇_第21张图片
一文pyqt篇_第22张图片
一文pyqt篇_第23张图片
一文pyqt篇_第24张图片

六、信号与槽

6.1 介绍

一文pyqt篇_第25张图片
一文pyqt篇_第26张图片

6.2 案例一:clicked

一文pyqt篇_第27张图片

6.3 案例二:自定义信号

一文pyqt篇_第28张图片
一文pyqt篇_第29张图片
一文pyqt篇_第30张图片

6.4 案例三:模拟消息发送

一文pyqt篇_第31张图片
一文pyqt篇_第32张图片
一文pyqt篇_第33张图片

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(sender());

    QPushButton* btn= dynamic_cast(sender())

}

带返回值的信号槽,槽函数有返回值

可通过

value = emit mysignal() 

得到返回值。

七、Qt Designer

7.1 动态加载ui

.ui -》uic.loadUi()
一文pyqt篇_第34张图片

7.2 获取控件

一文pyqt篇_第35张图片
一文pyqt篇_第36张图片
方便对控件绑定槽函数

八、多线程

只要是带界面的程序,一般来说程序运行后,会用当前线程进行事件的检查,按钮等图形界面的更新操作,如果在执行某个逻辑代码时,耗时严重就会出现界面卡顿。
所以一般将界面的显示用主线程来操作,逻辑功能代码或者耗时操作的代码都用另外线程处理。

8.1 多线程示例

一文pyqt篇_第37张图片
一文pyqt篇_第38张图片
一文pyqt篇_第39张图片
一文pyqt篇_第40张图片
一文pyqt篇_第41张图片

8.2 多个线程之间信号传递

一文pyqt篇_第42张图片
一文pyqt篇_第43张图片
一文pyqt篇_第44张图片
连接云函数
一文pyqt篇_第45张图片
子线程发送显示信号给主界面线程
信号在界面类中创建,连接,槽函数
一文pyqt篇_第46张图片
一文pyqt篇_第47张图片
一文pyqt篇_第48张图片
一文pyqt篇_第49张图片
子线程如何知道界面线程的信号?创建子线程对象时当参数传入线程类。
一文pyqt篇_第50张图片
一文pyqt篇_第51张图片

你可能感兴趣的:(pyqt)