Qt5 connect 重载信号和槽

转载文章超哥的经验之谈---Qt5 connect使用之“重载信号和槽”

Qt4中,关联信号与槽是要使用到SIGNAL()SLOT()这两个宏。

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                 label,  SLOT(setNum(int)));

但是Qt5中更改了写法

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

上面两种写法都是没有任何问题,都可以实现关联信号和槽。

Qt4中,因为是会制定信号和槽的参数类型,所以就不会发生不知道调用哪个槽或者信号的问题,但是在Qt5中,如果你遇到了重载的信号或者是槽,该如何指定想要调用的信号或者槽呢?

比如QComboBox这个类,这是别人举例的这个,我写下这个的时候,这个类的信号没有这个重载了。

这是之前的:

void QComboBox::currentIndexChanged(const QString &text)

void QComboBox::currentIndexChanged(int index)

Qt5.15.2的时候已经改变了,我个人觉得,这个可能是官方有意避免这种重载的写法。

QComboBox Class : Signals

void activated(int index)
void currentIndexChanged(int index)
void currentTextChanged(const QString &text)
void editTextChanged(const QString &text)
void highlighted(int index)
void textActivated(const QString &text)
void textHighlighted(const QString &text)

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, 可以使用 QOverloadQConstOverloadQNonConstOverload 辅助类

... 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)
posted @ 2021-09-29 10:23  hokori  阅读(1094)  评论(0编辑  收藏  举报