《Qt信号槽的几种写法》
2017-09-26 10:13
148 查看
信号槽是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作为字符串处理,简单的写法为:
这里SIGNAL和SLOT宏将两个函数名转化为了字符串处理
第二种写法为:connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::close);
这时我们使用信号槽的函数地址作为参数,相比于第一种简单的做法,这样做的好处是可以在编译期获得类型检查
第三种写法是当第三个参数为其本身(this指针)时,可以将其省略。
第四种写法即参数变为了指向成员函数的指针,当成员函数没有重载时,我们可以直接使用:
connect(this,&MainWindow::send,this,&MainWindow::close); 其中send为无参成员函数,当我们加入一个重载void send(const QString &str);时,上述代码就会报错,因为编译器无法确定使用哪一个函数,此时需要我们显示指定调用的成员函数,有两种写法,其原理是一样,只不过一种函数指针有名字,一种为匿名函数指针:
匿名函数指针采用显示类型转换,这样当我们的函数参数改变时,不会因为编译器的隐式转换导致问题:
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";
});
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";
});
相关文章推荐
- Java多线程编程-单例模式几种写法的错与对
- 单例模式的几种写法及分析
- 回字有几种写法?看Java里面让初学者迷惑的东西
- 单例模式java中的几种写法和确保多线程下安全
- JS的几种写法
- Java学习 - List与Map初始化的几种写法
- 全面理解Javascript闭包和闭包的几种写法及用途
- ajax我遇到的几种写法
- java定义二维数组的几种写法(转)
- 存储过程几种写法
- 设计模式——单例模式的几种写法
- 单例的几种写法
- 面试中单例模式有几种写法
- 归纳下js面向对象的几种常见写法总结
- 简洁的几种javascript写法
- 单例模式的几种写法
- javascript中for循环的几种写法与总结
- SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法