Qt 信号槽(笔记)

网友投稿 274 2022-09-23

Qt 信号槽(笔记)

了解信号槽

看一个例子:

先看代码

#include #include >int main(int argc, char *argv[]){ QApplication app(argc, argv); QPushButton button("Quit"); QObject::connect(&button, &QPushButton::clicked, &QApplication::quit); button.show(); return app.exec();}

代码和上一篇的HelloWorld类型,只不过把文本框换成了按钮(button)

但是有一行是特别的

QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);

connect的常用形式是:

connect(sender,   signal,

receiver, slot);

四个参数分别是发出信号的对象, 信号, 接收者, 接受者在接到信号后做出的反应(即调用的函数)。

即sender 发生信号 signal后, 就调用receiver的slot函数。

QObject::connect有5种重载

QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType);QMetaObject::Connection connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMethod &, Qt::ConnectionType);//将this指针作为receiver,隐式传入QMetaObject::Connection connect(const QObject *, const char *, const char *, Qt::ConnectionType) const;QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, const QObject *, PointerToMemberFunction, Qt::ConnectionType)QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, Functor);

对应位置的参数分别和基本形式对应

从中可以看出

connect()函数的sender和reveicer都是QObject指针,

signal和slot一致,可以是char*,QMethod, PointerToMemberFunction

第5个比较特别 最后一个参数是Functor。 这个类型可以接受 static 函数、全局函数以及 Lambda 表达式。

信号槽要求信号和槽的参数类型一致。允许槽函数的参数可以比信号的少(这样槽会忽略信号传来的多余的参数)

自定义信号槽:

这个例子定义了一个发送者Newspaper(报纸),一个接收者Reader(读者)

发送者:报纸 有1个信号,

接受者 :读者 有1个成员函数 在connect时用作槽。

// newspaper.h//Newspaper类 继承了QObject,继承了它的信号槽class Newspaper : public QObject{ //QObject类(及其子类)都要在第1行写Q_OBJECT Q_OBJECTpublic: Newspaper(const QString & name) : m_name(name) { } void send() { emit newPaper(m_name); //emit:发出newPaper()信号, 感兴趣的接受者会关注这个信号 }//signals:该类的信号signals: //函数名就是信号,返回值是void,参数是让外界知道的数据。不需要在.cpp中实现 void newPaper(const QString &name);private: QString m_name;};

reader.h

接收者receiver:Reader

/ reader.h#include #include //接收信号,继承QObject ,添加Q_OBJECTclass Reader : public QObject{ Q_OBJECTpublic: Reader() {}//成员函数 作为 槽函数 void receiveNewspaper(const QString & name) { qDebug() << "Receives Newspaper: " << name; }};

main.cpp

在主函数先创建1个newspaper(发送者) 和 1个reader(接收者)

使用函数connect()让我们连接发送者和接收者,及发送者的信号,接收者的槽。

当调用newspaper的send时,send执行函数emit newsPaper 即发送信号newsPaper

接收者reader自动接收信号,调用相应的槽

Reader::receiveNewspaper

执行对应的语句

qDebug() << "Receives Newspaper: " << name;

在控制台输出:

Receives Newspaper: "Newspaper A"

#include #include "newspaper.h"#include "reader.h"int main(int argc, char *argv[]){ QCoreApplication app(argc, argv);//创建 报纸 和 接受者 Newspaper newspaper("Newspaper A"); Reader reader; //连接 QObject::connect(&newspaper, &Newspaper::newPaper, &reader, &Reader::receiveNewspaper); //调用send函数,newspaper的send函数就发送 1个信号newPaper,然后连接者newspaper的reader调用槽函数 newspaper.send(); return app.exec();}

注:如果运行出现LINK错误,解决办法:确定代码正确后重新qmake(右键项目,选择qmake)

总结:

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:c++primer plus 6 读书笔记 第十四章 C++中的代码重用
下一篇:DoMarketing-营销智库:文案不能过稿,你肯定踩到这7个雷!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~