目录

  • 一、第一个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程序

python mqtt发布 pyqt mqtt_控件


类的写法:

python mqtt发布 pyqt mqtt_多线程_02

二、模块介绍

python mqtt发布 pyqt mqtt_控件_03

三、控件

3.1 QPushbutton,QRadioButton,QGroupBox

python mqtt发布 pyqt mqtt_多线程_04


python mqtt发布 pyqt mqtt_pyqt_05

3.2 Qlable

python mqtt发布 pyqt mqtt_Layout_06

3.3 QLineEdit

python mqtt发布 pyqt mqtt_多线程_07

3.4 窗口调整

python mqtt发布 pyqt mqtt_控件_08


python mqtt发布 pyqt mqtt_python mqtt发布_09


python mqtt发布 pyqt mqtt_Layout_10

四、布局

4.1 QBoxLayout

QVBoxLayout

python mqtt发布 pyqt mqtt_python mqtt发布_11


python mqtt发布 pyqt mqtt_控件_12


QHBoxLayout

python mqtt发布 pyqt mqtt_python mqtt发布_13

4.2 QGridLayout

python mqtt发布 pyqt mqtt_多线程_14

4.3 QFormLayout

表单提交

python mqtt发布 pyqt mqtt_控件_15

4.4 QStackedLayout

抽屉布局:提供了多页面切换的布局,一次只能看到一个界面

python mqtt发布 pyqt mqtt_控件_16


python mqtt发布 pyqt mqtt_python mqtt发布_17


python mqtt发布 pyqt mqtt_pyqt_18


python mqtt发布 pyqt mqtt_Layout_19


python mqtt发布 pyqt mqtt_python mqtt发布_20


python mqtt发布 pyqt mqtt_控件_21

五、窗口

5.1 分类

python mqtt发布 pyqt mqtt_Layout_22


python mqtt发布 pyqt mqtt_控件_23


python mqtt发布 pyqt mqtt_控件_24


python mqtt发布 pyqt mqtt_控件_25

六、信号与槽

6.1 介绍

python mqtt发布 pyqt mqtt_Layout_26


python mqtt发布 pyqt mqtt_多线程_27

6.2 案例一:clicked

python mqtt发布 pyqt mqtt_pyqt_28

6.3 案例二:自定义信号

python mqtt发布 pyqt mqtt_多线程_29


python mqtt发布 pyqt mqtt_控件_30


python mqtt发布 pyqt mqtt_Layout_31

6.4 案例三:模拟消息发送

python mqtt发布 pyqt mqtt_python mqtt发布_32


python mqtt发布 pyqt mqtt_python mqtt发布_33


python mqtt发布 pyqt mqtt_多线程_34

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

python mqtt发布 pyqt mqtt_多线程_35

7.2 获取控件

python mqtt发布 pyqt mqtt_python mqtt发布_36


python mqtt发布 pyqt mqtt_pyqt_37


方便对控件绑定槽函数

八、多线程

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

8.1 多线程示例

python mqtt发布 pyqt mqtt_pyqt_38


python mqtt发布 pyqt mqtt_多线程_39


python mqtt发布 pyqt mqtt_pyqt_40


python mqtt发布 pyqt mqtt_Layout_41


python mqtt发布 pyqt mqtt_Layout_42

8.2 多个线程之间信号传递

python mqtt发布 pyqt mqtt_多线程_43


python mqtt发布 pyqt mqtt_pyqt_44


python mqtt发布 pyqt mqtt_python mqtt发布_45


连接云函数

python mqtt发布 pyqt mqtt_python mqtt发布_46


子线程发送显示信号给主界面线程

信号在界面类中创建,连接,槽函数

python mqtt发布 pyqt mqtt_多线程_47


python mqtt发布 pyqt mqtt_多线程_48


python mqtt发布 pyqt mqtt_pyqt_49


python mqtt发布 pyqt mqtt_pyqt_50


子线程如何知道界面线程的信号?创建子线程对象时当参数传入线程类。

python mqtt发布 pyqt mqtt_多线程_51


python mqtt发布 pyqt mqtt_Layout_52