• Qt之信号与槽


    有关这个概念网上有太多太多的资料了,这些资料也非常健全,比如下面这些文章,后两篇比较高端,现在还没完全整明白,感谢tingsking18大神

    http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/

    http://blog.csdn.net/tingsking18/article/details/4800828

    http://blog.csdn.net/tingsking18/article/details/4991563


     接下来就来谈谈自己碰到的一些注意事项,关于connect信号与槽的参数问题

    1、信号与槽中的参数个数与类型必须完全一样,什么意思,看下面的代码,曾经的一个错误:

    connect(button, SIGNAL(clicked()), this, SLOT(sendMessage(QString)));

    本意是连接qpushbutton的clicked()信号与槽sendMessage(),其中槽有一个形参类型为QString,这样一切编译通过,可是调试的时候发现根本进不了槽函数,问题就出现在信号与槽函数的参数个数不一样。将上述代码改成connect(but, SIGNAL(clicked(QString)), this, SLOT(sendMessage(QString)));即可。注意这是Qt中的使用SIGNAL()和SLOT()的一个自身的缺陷,在编译时不会检查这种错误,只有在运行时才会在程序的输出窗口输出错误。我这里用的VS2010来调试,观察输出窗口,会发现输出了以下的错误:

    QObject::connect: Incompatible sender/receiver arguments
    MyButton::clickButton() --> onefloor::sendMessage(QString)

    另外,参数类型必须完全一样,即信号参数为QString,槽参数也必须为QString,不能int对应QString。这就是信号与槽中的参数个数与类型必须完全一样的含义。

    这个问题在Qt5中推荐使用一种更加安全的方法,下面再讨论

    2、信号与槽函数中不能有形参名。还是看个错误的例子

    connect(button, SIGNAL(config(QString abc)), this, SLOT(configAddr(QString str)));

    还是一样,编译时不会报错,运行时在输出窗口时可以看到错误,最终的结果当然也是槽函数没有响应。


     上面提到的Qt5中会推荐一种使用方法,可以避免信号与槽连接时运行时报错,不方便查找错误。

    connect(obj1, &ClassA::fun1, obj2, &ClassB::fun2);

    针对第一个例子,也就是写成这样connect(button, &MyButton::clickButton, this, &onefloor::sendMessage);

    这样,就可以再编译的时候检查信号与槽是否存在,并进行参数类型检查。

    有关Qt5中connect的说明,可以参考以下两篇博客http://blog.csdn.net/dbzhang800/article/details/6547196 和 http://www.linuxidc.com/Linux/2014-04/100581.htm

  • 相关阅读:
    第七次作业--项目需求分析(团队)
    第六次作业--结对编程第二次
    第四次作业--项目选题报告
    alpha冲刺4
    alpha冲刺3
    Alpha 冲刺报告2
    Alpha 冲刺报告
    项目需求分析答辩总结
    项目UML设计(团队)
    项目选题报告答辩总结
  • 原文地址:https://www.cnblogs.com/jiasaidongqi/p/4417636.html
Copyright © 2020-2023  润新知