2.3信号和槽(上)
如果面试官问你Qt最明显区别于其它开发框架的特征是什么 , 那么你的回答一定是信号和槽 , 为此 , 小豆君将拿出三节的时间来讲述信号和槽 。
本节只讲解非线程间的信号槽 , 等后面学习的深入 , 再讲解线程间信号槽通信 。
第一节 , 信号槽的基本概念 。
第二节 , 信号槽的扩展知识 。
第三节 , 分析Qt的moc与编译器生成的moc源文件 , 帮助大家理解信号槽的来龙去脉 。
2.3.1 引子在面向对象的编程方法中 , 都会创建很多的实例 , 每个实例都是单独的 , 要想每个实例能够协同合作 , 那么就会需要一种对象间传递消息的机制 , 在很多框架中都采用回调函数来进行对象间信息传递 。
回调是一个指向函数的指针 , 如果想要一个处理函数通知一些事件 , 你需要将这个指针传递给处理函数 。 处理函数在适当时间调用回调函数 。 MFC就是使用的回调函数 , 但回调可能是不直观的 , 不易于理解的 , 并且也不能保证是类型安全的 。
Qt为了消除回调函数等的弊端 , 从而开发了一种新的消息传递机制 , 即信号和槽 。
例如 , 当我们要求鼠标点击某个按钮时 , 对应的窗口就需要关闭 , 那么这个按钮就会发出一个点击信号 , 而窗口接收到这个信号后执行关闭窗口 。 那么 , 这个信号就是按钮被点击 , 而槽就是窗口执行关闭函数 。
可以将信号和槽理解成“命令-执行” , 即信号就是命令 , 槽就是执行命令 。
文章插图
2.3.2 信号当一个对象的内部状态发生改变时 , 如果其它对象对它的状态需要有所反应 , 这时就应该让这个类发出状态改变的信号 。
声明信号使用signals关键字
发送信号使用emit关键字
注意:
1.所有的信号声明都是公共的 , 所以Qt规定不能在signals前面加public,private, protected 。 2.所有的信号都没有返回值 , 所以返回值都用void 。 3.所有的信号都不需要定义 。 4.必须直接或间接继承自QOBject类 , 并且开头私有声明包含Q_OBJECT 。 5.当一个信号发出时 , 会立即执行其槽函数 , 等待槽函数执行完毕后 , 才会执行后面的代码 , 如果一个信号链接了多个槽 , 那么会等所有的槽函数执行完毕后才执行后面的代码 , 槽函数的执行顺序是按照它们链接时的顺序执行的 。 6.在链接信号和槽时 , 可以设置链接方式为:在发出信号后 , 不需要等待槽函数执行完 , 而是直接执行后面的代码 。 7.发出信号使用emit关键字 。 8.信号参数的个数不得少于槽参数的个数 。
2.2.3 槽【2.3信号和槽(上)】槽其实就是普通的C++函数 , 它唯一特点就是能和信号链接 。 当和它链接的信号被发出时 , 这个槽就会被调用 。
声明槽可以使用:public/protected/private slots:
以上是Qt4的做法 , 在Qt5中你也不需要使用这些声明 , 每个函数都可以被当作是槽函数 , 而且还可以使用Lambda表达式来作为槽 。 不过为了程序的可读性 , 我还是推荐槽函数要声明一下 。
2.2.4连接信号和槽使用connect函数连接信号和槽
2.2.4.1 原型1static QMetaObject::Connection connect(const QObject *sender, //信号发送对象指针const char *signal,//信号函数字符串 , 使用SIGNAL()const QObject *receiver, //槽函数对象指针const char *member, //槽函数字符串 , 使用SLOT()Qt::ConnectionType = Qt::AutoConnection//连接类型 , 一般默认即可);//例如connect(pushButton, SIGNAL(clicked()), dialog,SLOT(close()));
Qt4和Qt5都可以使用这种连接方式
2.2.4.2 原型2static QMetaObject::Connection connect(const QObject *sender, //信号发送对象指针const QMetaMethod //例如connect(pushButton, QPushButton::clicked, dialog,QDialog::close);
推荐阅读
- 手机能用多久?如果出现这3种征兆,说明“默认使用时间”已到
- 近期浙江引来这么多重磅级“帮手”传递什么信号?
- 支付宝发布新规,用户如果出现这3种情况,花呗或将直接封停
- iPhone 12信号差真实原因曝光:不是基带问题
- Verizon的5G网络将覆盖至全美2.3亿人
- iPhone12 重现iPhone 7“信号门”,但库克沉默
- 计算机专业大三学生,如果想主攻前端开发,该重视哪些内容
- 将要报废的手机会出现这三个信号,你出现了吗?
- 手机信号增强贴 警惕别被伪科技忽悠了
- 大数据专业的同学,如果要往人工智能方向发展,该怎么选课