博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT+信号有参数与无参数的实现+QT4和QT5在信号和槽使用上的区别
阅读量:5255 次
发布时间:2019-06-14

本文共 3651 字,大约阅读时间需要 12 分钟。

在QT5中,信号有参数和无参数

#ifndef SUBWIDGET_H#define SUBWIDGET_H#include 
#include
class SubWidget : public QWidget{ Q_OBJECTpublic: explicit SubWidget(QWidget *parent = 0); void sendSlot();signals: /*信号必须有singles关键字来声明 * 信号没有返回值,但可以有参数 * 信号就是函数的生命,只需声明,无需定义 * 使用:emit mySignal(); */ void mySignal(); void mySignal(int , QString);public slots:private: QPushButton btn4;};#endif // SUBWIDGET_H
#include "subwidget.h"SubWidget::SubWidget(QWidget *parent) : QWidget(parent){    this->setWindowTitle("波老师");    this->setFixedSize(360,480);    btn4.setParent(this);    btn4.setText("切换到苍老师");    //点击按钮btn4实现给主窗口发送信号    connect(&btn4,&QPushButton::clicked,this,&SubWidget::sendSlot);}void SubWidget::sendSlot(){    emit mySignal();    emit mySignal(250,"我是子窗口");}

 

 

#ifndef MAINWIDGET_H#define MAINWIDGET_H#include 
#include
#include "subwidget.h"//自子窗口头文件class MainWidget : public QWidget{ Q_OBJECTpublic: MainWidget(QWidget *parent = 0); ~MainWidget(); void mySlot();//自定义的槽函数 void changeWin(); void dealWin(); void subSlot(int a,QString str);private: QPushButton btn1; QPushButton *btn2; QPushButton btn3; SubWidget w;//该对象在主窗口中,子窗口没有办法调用,所以需要利用子窗口发送给主窗口消息,进而主窗口进行处理};#endif // MAINWIDGET_H

 

 

 

#include "mainwidget.h"#include 
#include
MainWidget::MainWidget(QWidget *parent) : QWidget(parent){// QPushButton btn1;// QPushButton btn2; btn1.setParent(this); btn1.setText("colse"); btn1.move(100,100); btn2 = new QPushButton(this);//指针没有空间,是需要动态的对其进行空间的分配 btn2 ->setParent(this); btn2 ->setText(" 3 2 1 "); connect(&btn1,&QPushButton::pressed,this ,&MainWidget::close); /* 对connect的说明: * &btn1 :信号发出着,指针类型 * &QPushButton::pressed:处理信号, &发送者的类名::信号名字 * this:信号接收者 * &MainWidget::close: 槽函数,信号处理函数 &接收者的类名::槽函数名字 */ /*自定义槽,说的更加通俗一点,就是普通函数的用法 * QT5:可以是 任意的成员函数(常用这种方法,直接写成该类的成员函数),普通全局函数,静态函数 都可以是槽函数 * 槽函数需要和信号一致(参数,返回值) * 由于信号都是没有返回值,所以,槽函数一定没有返回值 */ //释放按钮btn2实现里面的文本内容发生改变 connect(btn2,&QPushButton::released,this,&MainWidget::mySlot);//在写自定义信号槽函数的时候,一定要看发送信号函数的类型,这里released信号的函数是:void QAbstractButton::released() //即released函数没有参数,也没有返回值,槽函数需要和信号一致,也没有参数和返回值 //释放按钮btn2隐藏按钮btn1 connect(btn2,&QPushButton::released,&btn1,&QPushButton::hide); //互相切换窗口的小游戏 this->setFixedSize(360,480); this ->setWindowTitle("苍老师"); btn3.setParent(this); btn3.setText("换到波老师"); btn3.move(50,50); //显示子窗口// w.show(); //点击按钮btn3实现主窗口隐藏,子窗口显示 connect(&btn3,&QPushButton::released,this,&MainWidget::changeWin); //处理子窗口发送过来的信号 void (SubWidget::*funSognal)() = &SubWidget::mySignal; connect(&w,funSognal,this,&MainWidget::dealWin); //处理子窗口发送过来的信号(有参数) void (SubWidget::*testSognal)(int ,QString) = &SubWidget::mySignal; connect(&w,testSognal,this,&MainWidget::subSlot);}//自定义槽函数的实现void MainWidget::mySlot(){ btn2->setText("I LOVE YOU");}void MainWidget::changeWin(){ //子窗口显示, w.show(); //本窗口隐藏 this ->hide();}void MainWidget::dealWin(){ //子窗口隐藏 w.hide(); //本窗口显示 this->show();}void MainWidget::subSlot(int a,QString str){ qDebug()<
<

当信号函数发生重载的时候,为了不产生二义性,需要使用函数指针的方式进行区分,(这里需要重点掌握指针函数的用法),同时从这种写法来看,也不难看出其在语法上还是比较难的,在QT4中则没用这么难,方式如下:

  1)对槽函数声明public slots:

  2)其最大的优势是当写connect中的SIGNAL和SLOT时会自动提示信号的类型,

既然QT4在这个方面那么简单简洁,为什么还要用QT5那么难的语法呢(函数指针)?这是因为在QT4中 SIGNAL 和SLOT 将函数名字转化成字符串  不进行错误的检查,只在运行的时候来提示程序不可行,在大的项目中,代码量是非常大的,我们还是尽量希望其能够提示语法的错误,不希望最后运行时提示有错误。

转载于:https://www.cnblogs.com/doker/p/11026582.html

你可能感兴趣的文章
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
熟用TableView
查看>>
Java大数——a^b + b^a
查看>>
poj 3164 最小树形图(朱刘算法)
查看>>
服务器内存泄露 , 重启后恢复问题解决方案
查看>>
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>