表单提交
是信号(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()
得到返回值。
只要是带界面的程序,一般来说程序运行后,会用当前线程进行事件的检查,按钮等图形界面的更新操作,如果在执行某个逻辑代码时,耗时严重就会出现界面卡顿。
所以一般将界面的显示用主线程来操作,逻辑功能代码或者耗时操作的代码都用另外线程处理。
连接云函数
子线程发送显示信号给主界面线程
信号在界面类中创建,连接,槽函数
子线程如何知道界面线程的信号?创建子线程对象时当参数传入线程类。