您当前的位置: 首页 > 

我什么都布吉岛

暂无认证

  • 2浏览

    0关注

    292博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

String-Based 和 Functor-Base的Connect区别

我什么都布吉岛 发布时间:2021-06-19 15:06:24 ,浏览量:2

在Qt5.0之后,QObject::connect在String-Based的基础上增加了Functor-Base形式的语法,他们之间的区别主要如下:

基于字符串的基于函数的类型检查完成时间运行时编译时是否可以隐式转换否是支持信号连接至Lambda否是支持槽参数大于信参数(通过默认参数)是否支持C++函数连接至QML函数是否

下面将对上述几个方面进行解释:

一、类型检查和隐式转换

String-based类型的连接将会在运行时对比字符串来完成检查,这样有三个限制:

  • 只有当程序运行时才能检查到错误
  • 隐式转换无法用在信号和槽
  • typedef和namespace无法被解析

后两者不可行的原因是,string比较器无法获知C++真正的类型,所以需要严格的字符串匹配。

auto slider = new QSlider(this);
auto doubleSpinBox = new QDoubleSpinBox(this);

// OK: The compiler can convert an int into a double
connect(slider, &QSlider::valueChanged,
       doubleSpinBox, &QDoubleSpinBox::setValue);

// ERROR: The string table doesn't contain conversion information
connect(slider, SIGNAL(valueChanged(int)),
       doubleSpinBox, SLOT(setValue(double)));
二、连接Lambda表达式
class TextSender : public QWidget {
    Q_OBJECT

    QLineEdit *lineEdit;
    QPushButton *button;

signals:
    void textCompleted(const QString& text) const;//发送一个QString参数信号

public:
    TextSender(QWidget *parent = nullptr);
};
TextSender::TextSender(QWidget *parent) : QWidget(parent) {
    lineEdit = new QLineEdit(this);
    button = new QPushButton("Send", this);

    connect(button, &QPushButton::clicked, [=] {
        emit textCompleted(lineEdit->text());//虽然QPushButton的clicked信号是无参的,但是通过Lambda捕获可以发送一些额外的信息,如这里的QString.
    });
}

注意:虽然Functor-based类型的连接中函数指针可以是包含普通函数(包括成员函数)的任意类型,但是为了可读性,最好是slots Lambda表达式或者signals中的一种。

三、连接C++对象至QML对象

不了解QML,略

四、在slots中使用默认参数连接更少参数的信号

一般来说,信号参数和槽参数个数是相等的,当然你可以发送多点信号给我,槽可以不接收,但是一般不能少发信号。

public slots:
    void printNumber(int number = 42) {
        qDebug()             
关注
打赏
1658157489
查看更多评论
0.0429s