《Qt信号槽的几种写法》
来源:互联网 发布:淘宝如何设置关联旺旺 编辑:程序博客网 时间:2024/06/03 15:22
信号槽是Qt的核心部分,它使得对象之间的的通信变得很简单。Qt通过connect来连接信号与槽,当信号被发出时,槽函数立刻被执行,connect函数有五个重载:
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);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);
我们可以看到重载一将signal和slot作为字符串处理,简单的写法为:
QObject::connect(&button, SIGNAL(clicked()),&app, SLOT(quit()));这里SIGNAL和SLOT宏将两个函数名转化为了字符串处理
第二种写法为:
connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::close);这时我们使用信号槽的函数地址作为参数,相比于第一种简单的做法,这样做的好处是可以在编译期获得类型检查
第三种写法是当第三个参数为其本身(this指针)时,可以将其省略。
第四种写法即参数变为了指向成员函数的指针,当成员函数没有重载时,我们可以直接使用:
connect(this,&MainWindow::send,this,&MainWindow::close);其中send为无参成员函数,当我们加入一个重载void send(const QString &str);时,上述代码就会报错,因为编译器无法确定使用哪一个函数,此时需要我们显示指定调用的成员函数,有两种写法,其原理是一样,只不过一种函数指针有名字,一种为匿名函数指针:
void (MainWindow:: *newFunName) (const QString &) = &MainWindow::send;connect(this,newFunName,&re,&Receiver::receiver);
匿名函数指针采用显示类型转换,这样当我们的函数参数改变时,不会因为编译器的隐式转换导致问题:
connect(this,static_cast<void (MainWindow:: *)(const QString &)>(&MainWindow::send),&re,&Receiver::receiver);
最后一种写法槽函数为Functor 类型。这个类型可以接受 static 函数、全局函数以及 Lambda 表达式.
connect(this,static_cast<void (MainWindow:: *)(const QString &)>(&MainWindow::send),[]{ qDebug() << "lambda"; });
阅读全文
0 0
- 《Qt信号槽的几种写法》
- QT 信号和槽需要注意的几点
- QT---QT的信号槽
- Qt信号的槽
- QT的信号和信号槽
- <Qt>重载信号的信号槽处理
- QT的信号和槽
- Qt的信号和槽
- QT的信号和槽
- QT的信号和槽
- QT的信号/槽机制
- Qt 信号槽的实现
- QT的信号和槽
- QT的信号和槽
- QT的信号和槽
- Qt 的信号与槽
- QT的信号/槽机制
- Qt的信号槽机制
- C语言,进制转换之二进制转十六进制,完整代码
- tcp优化
- 过滤器与拦截器的区别
- 提升docker中的MySQL数据库数据安全性
- logstash-input-log4j 插件使用简介
- 《Qt信号槽的几种写法》
- leetcode 155. Min Stack
- HBase 简介、架构、工作原理深析——(二)
- Effective STL 41 Understand the reasons for ptr_fun, mem_fun, and mem_fun_ref
- CSDN的MarkDown编辑器中关于水印的处理
- laravel SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES)
- helloworld——springmvc
- 在代码中如何判断DataSet中是否有记录
- Unity3d中脚本的生命周期图