欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt5 connect 使用之“重载信号和槽”

程序员文章站 2024-01-02 21:25:10
...

很久之前写过一篇关于 Qt connect 使用的文章 Qt5 connect 使用之“传说中的第五参数”. 大家有兴趣的可以去看看

另外我的个人网站我的个人网站 chaocc.wang 上有我各类文章的汇总, 大家有兴趣也可以去看看

重载信号、槽的多种 connect 方式

相信大家都遇到过 Qt 的重载信号(或者重载槽函数), 使用重载信号最常见的 connect 方式是使用 Qt4 中基于字符串匹配的 connect, 今天就为大家分享几种其他实现方式。下面以QComboBoxcurrentIndexChanged信号为例:

void QComboBox::currentIndexChanged(const QString &text)

void QComboBox::currentIndexChanged(int index)

QComboBox::currentIndexChanged 信号有以上两种重载, 分别参数为字符串类型和整型。
下面以字符串类型参数为例:

auto *comboBox = new QComboBox;
auto *label    = new QLabel;

// ① 基于字符串匹配 connect
connect(comboBox, SIGNAL(currentIndexChanged(const QString&)),
    label, SLOT(setText(const QString&)));

// ② 基于方法地址匹配 connect. 使用 static_cast 实现
connect(comboBox,
    static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),
    label, &QLabel::setText);

// ③ 基于方法地址匹配 connect, 使用 方法地址 实现
void(QComboBox::*curChangeSiganl)(const QString&) = &QComboBox::currentIndexChanged;
connect(comboBox, curChangeSiganl, label, &QLabel::setText);

除了以上三种实现方式, Qt 也有自己的实现方式: qOverload


// ④ 基于方法地址匹配 connect, 使用 QOverload 实现
connect(comboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
    label, &QLabel::setText);

// ⑤ 基于方法地址匹配 connect, 使用 qOverload 实现. 需要 支持 C++14
connect(comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
    label, &QLabel::setText);

qOverload

上面的案例 ④⑤ 是qOverload的基础语法使用。
qOverload 的作用是返回重载函数的指针,模板参数为函数类型列表

struct Foo {
    void overloadedFunction();
    void overloadedFunction(int, const QString &);
    void overloadedFunction(int, const QString &) const;
};
... qOverload<>(&Foo::overloadedFunction)
... qOverload<int, const QString &>(&Foo::overloadedFunction)

针对const 重载, 可以使用qConstOverloadqNonConstOverload

... qConstOverload<int, const QString &>(&Foo::overloadedFunction)
... qNonConstOverload<int, const QString &>(&Foo::overloadedFunction)

qOverload 需要 C++14 支持. 针对 C++11, 可以使用 QOverload、QConstOverload、QNonConstOverload 辅助类

... QOverload<>::of(&Foo::overloadedFunction)
... QOverload<int, const QString &>::of(&Foo::overloadedFunction)

... QConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
... QNonConstOverload<int, const QString &>::of(&Foo::overloadedFunction)

上一篇:

下一篇: