Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >PyQt和Qt在处理用户定义的信号/时隙时的区别

PyQt和Qt在处理用户定义的信号/时隙时的区别
EN

Stack Overflow用户
提问于 2013-07-21 04:05:35
回答 1查看 754关注 0票数 0

嗯,我对Qt很熟悉,但是当使用PyQt时,信号/插槽的语法让我很困惑。当使用C++/Qt时,编译器会给出错误信号/插槽的提示,但是PyQt默认配置不会提示错误。是否有某种方式或例如调试触发器模式使PyQt能够显示更多信息?“守则”如下:

代码语言:javascript
代码运行次数:0
复制
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time

class workThread(QThread):

    def __init__(self,parent = None):
        super(workThread,self).__init__(parent)
        self.mWorkDoneSignal = pyqtSignal() ## some people say this should be defined as clas member, however, I defined it as class member and still fails.

    def run(self):
        print "workThread start"
        time.sleep(1)
        print "workThread stop"
        print self.emit(SIGNAL("mWorkDoneSignal"))

class MainWidget(QWidget):
    def __init__(self , parent = None):
        super(MainWidget,self).__init__(parent)

    @pyqtSlot()
    def display(self):
        print "dispaly"

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    c = workThread()
    d = MainWidget()
    ##In Qt, when using QObject::connect or such things, the return value will show the 
    ## signal/slot binding is success or failed
    print QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))
    c.start()
    d.show()
    app.exec_()

在C++中,QObject::connect返回值将显示信号/时隙绑定是否成功。在PyQt中,返回值为True,但它不触发插槽。我的问题是: 1)信号应该是类成员还是实例成员? 2)如果QObject.connect的返回值不能给出绑定成功与否的提示,还有其他方法来检测它吗?我想将信号/时隙绑定到信号发送方和时隙接收方之外,所以我希望使用QObject.connect方式。但是,如何正确地写出这个结果,我尝试了以下方法,但都失败了。

代码语言:javascript
代码运行次数:0
复制
 QObject.connect(c,SIGNAL('mWorkDoneSignal'),d,SLOT('display'))
 QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))
EN

回答 1

Stack Overflow用户

发布于 2013-07-21 12:08:14

首先,您应该将新型信号与pyqt结合使用。事实上,QObject.connectQObject.emit甚至不再存在在PyQt5中了。

代码语言:javascript
代码运行次数:0
复制
def __init__(self,parent = None):
    super(workThread,self).__init__(parent)
    self.mWorkDoneSignal = pyqtSignal()

这将创建一个未绑定的信号,并将其分配给实例变量mWorkDoneSignal,wich并没有真正的效果。如果您想要创建一个信号,那么您确实必须在类中声明它。

因此,如果您没有在这里真正创建一个信号,那么为什么这个调用会成功:

代码语言:javascript
代码运行次数:0
复制
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))

答案在于旧信号的处理 by PyQt4:

发出PyQt4信号的行为隐式地定义了它。

因此,当您将信号连接到插槽时,只会检查插槽是否存在。信号本身在这一点上并不真正需要存在,所以除非时隙不存在,否则调用总是成功的。

我试过以下方法,但都失败了。

代码语言:javascript
代码运行次数:0
复制
QObject.connect(c,SIGNAL('mWorkDoneSignal'),d,SLOT('display'))
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))

第一个失败是因为display (没有括号)不是一个有效的插槽。

第二个成功。它不能工作的原因是因为您发出了mWorkDoneSignal,但实际上需要发出的是:

代码语言:javascript
代码运行次数:0
复制
self.emit(SIGNAL("mWorkDoneSignal()"))

使用新风格的信号,没有办法把这样的事情搞砸:

代码语言:javascript
代码运行次数:0
复制
from utils import sigint
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time

class workThread(QThread):

    mWorkDoneSignal = pyqtSignal()

    def __init__(self,parent = None):
        super(workThread,self).__init__(parent)

    def run(self):
        print "workThread start"
        time.sleep(1)
        print "workThread stop"
        self.mWorkDoneSignal.emit()

class MainWidget(QWidget):
    def __init__(self , parent = None):
        super(MainWidget,self).__init__(parent)

    @pyqtSlot()
    def display(self):
        print "dispaly"

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    c = workThread()
    d = MainWidget()
    c.mWorkDoneSignal.connect(d.display)
    c.start()
    d.show()
    app.exec_()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17772143

复制
相关文章
使用 Nlog 将日志打印到 Logstash 的监控接口
Logstash提供了多种监听日志打印的方式,而Nlog也提供了多种输出日志的方式,当Nlog的输出配置与Logstash的输入配置相对应,就能够让Nlog打印出来的日志都存储到Elasticsearch中 以下介绍3种配置方式: 1)   文件 Logstash: input {       file {            path => "D:/Log/Application/*Log.txt"            type => "Application"       } } Nlog
Venyo
2018/03/15
1.2K0
将序列分解为单独的变量
python中,任何序列或可迭代的对象都可以通过一个简单的赋值操作来分解为单独的变量。前提是要求变量的总数和结构要与序列相吻合 #_*_coding:utf8_*_ p = (4, 5) x, y = p print(x) # 4 print(y) # 5 data = ['GuoJing', 30, ('杨过', '小龙女')] name, age, xialv = data print(name) # GuoJing print(xialv) # ('杨过', '小龙女') name, age, (
章鱼喵
2018/06/27
8820
怒打50行代码
redis中的数据都是以key/value的形式存储的,五大数据类型主要是指value的数据类型,包含如下五种:
暖月寒星
2020/03/10
4500
C算法实现:将字符串中的数字返回为整型数
今天看linux内核驱动的代码,发现一个算法写得挺简单,也有意思。 分享一下我的测试代码: #include <stdio.h> typedef int U32 ; U32 String2Dec( const char *pstr ) { char ch; U32 value; value = 0; //从字符串的第一个字符遍历到'\0' while( *pstr != '\0' ) { //获取字符
zy010101
2019/05/25
1.8K0
fscanf读取一行字符串-C中带有fscanf的无延迟循环
  C中带有fscanf的无延迟循环,c,C,您好,我在使用fscanf读取二进制文件时遇到问题,值没有被存储,而循环是无限的这是我的密码int main(){FILE *reads=fopen("E1.bin", "rb");;int temp=0,temp1=0,temp2=0;if (reads==NULL) {printf("Error");return 0;}else {while((fscanf(reads,"%d %d %d", temp, temp1, temp2))!= EOF
宜轩
2022/12/26
1.7K0
gin 框架将路由文件单独处理
首先,我们新建一个 routers 文件夹,这里面放置路由文件,包含一个总的router.go
句小芒
2022/12/29
6940
gin 框架将路由文件单独处理
c++如何将字符串转为数组(将字符串转换为数组)
string [] imgArr=imgData.Split(new char[]{‘,’});
全栈程序员站长
2022/07/29
7K0
C++中字符串的分割
下面开始正题,C++中字符串的分割。 1. 使用strtok函数进行字符串的分割 2. 使用stringstream类配合getline函数进行字符串的分割 3. 使用STL的find函数以及字符串类的substr函数进行字符串分割
卡尔曼和玻尔兹曼谁曼
2019/01/22
7.2K0
C++中字符串的分割
[C] C中的字符串处理函数
函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例:
轻舞飞扬SR
2021/02/24
2K0
C语言和C++中的字符串(string)
C语言字符串是字符的数组。单字节字符串顺序存放各个字符串,并用'\0'来表示字符串结束。在C语言库函数中,有一系列针对字符串的处理函数,比如说strcpy()、sprintf()、stoi()等,只能用于单字节字符串,当然也有一些函数用于处理Unicode字符串,比如wcscpy()、swprintf()等
用户7886150
2021/02/16
3K0
C语言 | 将字符串中的元音字母复制到另一个字符串中
解析:if语句判断一下每一个字母是否符合元音字母,读者看着道题的时候,需要注意一点的是如果用scanf函数是否可以,思考为什么要用gets函数?
小林C语言
2021/01/27
4.7K0
C语言 | 将字符串中的元音字母复制到另一个字符串中
c语言字符串赋值_c++中字符串变量
从大一学c语言到现在都快三年了,今天居然还在简单的字符串赋值的过程中犯了错误,应该记下来,以免日后再犯。
全栈程序员站长
2022/11/16
2.2K0
c# 将字符串转换为指定类型的值
private object GetValueByProperty(string key, string value, ref Type typeValue) { Type t = typeof(T); var property = t.GetProperty(key); if (property == null) { return value;
冰封一夏
2019/09/11
3.1K0
C++ 中的原始字符串文字及C++ 中的字符串数组(1-2)
theme: channing-cyan highlight: a11y-dark
鲸落c
2022/11/14
1.8K0
[译]C#和.NET中的字符串
原文地址:Jon Skeet:Strings in C# and .NET System.String 类型(在C#语言中对应的别名是string)是.NET最重要的类型之一,不幸的是在它身上存在了太
潘成涛
2018/01/18
2.5K0
C++中对字符串的分割
由于C++中没有split函数,因此,为了能够对获取的字符串进行按一定符号进行分割,在此学习了通过字符串的find()方法和substr()方法来实现split();具体描述如下:  //涉及到string类的两个函数find和substr:  //  //1、find函数  //原型: size_t find(const string& str, size_t pos = 0) const;  //功能: 查找子字符串第一次出现的位置。  //参数说明:str为子字符串,pos为初始查找位置。  //返回值: 找到的话返回第一次出现的位置,否则返回string::npos  //2、substr函数  //原型: string substr(size_t pos = 0, size_t n = npos) const;  //功能: 获得子字符串。  //参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos)  //返回值: 子字符串
用户7886150
2021/01/16
2.3K0
fscanf读取一行字符串-C++的学习之路---12
  cin是C++编程语言中的标准输入流对象,即类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即类的对象,cerr是标准错误输出流的对象,也是 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
宜轩
2022/12/26
5960
C语言 | 将字符串a复制为字符串b并输出b
解题思路:定义两个字符数组a和b,对a数组初始化。将a数组中的每一个字符逐个复制到b数组中,程序中a和b都定义为字符数组,通过地址访问其数组元素。
小林C语言
2020/12/14
1.9K0
C语言 | 将字符串a复制为字符串b并输出b
python 中单独调用 django 的数据库模块
玉面小色熊
2017/07/28
3.8K0
python 中单独调用 django 的数据库模块
Excel应用实践05:分页单独打印Excel表中指定行的数据
在上一篇文章《Excel应用实践04:分页单独打印Excel表中的数据》中,我们编写了一段简单的VBA代码,能够快速将工作表中每行数据放置到表格模板中依次打印出来。现在的问题是,我只想打印其中的一行,或者从第m行到第n行的数据,这如何实现呢?
fanjy
2019/07/19
1.5K0
Excel应用实践05:分页单独打印Excel表中指定行的数据

相似问题

python3打印到字符串

24

将0打印到文件安全吗?

48

Python 2.7.8打印到一行,不带逗号

21

Python 3打印到文件创建错误的新行

10

将小数点后的零打印到excel中

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档