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

QComboBoxcurrentIndexChanged信号为例:
  1. void QComboBox::currentIndexChanged(const QString &text)
  2. void QComboBox::currentIndexChanged(int index)

可以看出QComboBoxcurrentIndexChanged信号有两个重载函数,参数分别为QStringint,如果直接使用connect函数则会导致编译不通过。

方法1:基于字符串匹配

  1. auto *comboBox = new QComboBox;
  2. auto *label = new QLabel;
  3. // 基于字符串匹配 connect
  4. connect(comboBox, SIGNAL(currentIndexChanged(const QString&)),
  5. label, SLOT(setText(const QString&)));

方法2:基于方法地址匹配(static_cast)

  1. auto *comboBox = new QComboBox;
  2. auto *label = new QLabel;
  3. // 基于方法地址匹配 connect. 使用 static_cast 实现
  4. connect(comboBox,
  5. static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),
  6. label,&QLabel::setText);

方法3:基于方法地址匹配(方法地址)

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

方法4:基于方法地址匹配(QOverload和qOverload)

注意:此方法需要QT5.7以上版本

  1. auto *comboBox = new QComboBox;
  2. auto *label = new QLabel;
  3. // 基于方法地址匹配 connect, 使用 QOverload 实现
  4. connect(comboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
  5. label, &QLabel::setText);
  6. // 基于方法地址匹配 connect, 使用 qOverload 实现. 需要 支持 C++14
  7. connect(comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
  8. label, &QLabel::setText);

qOverload、qNonConstOverload和qConstOverload

qOverload

qOverload返回指向(成员)函数的指针。

  1. auto qOverload(T functionPointer)

例子:

  1. struct Foo {
  2. void overloadedFunction();
  3. void overloadedFunction(int, const QString &);
  4. };
  5. ... qOverload<>(&Foo::overloadedFunction)
  6. ... qOverload<int, const QString &>(&Foo::overloadedFunction)

qNonConstOverload 和 qConstOverload

针对函数有const重载时, 可以使用qConstOverload和qNonConstOverload来区分。

其中qConstOverload返回有const重载的函数,qNonConstOverload返回非const重载的函数

  1. auto qNonConstOverload(T memberFunctionPointer) //返回非const重载
  2. auto qConstOverload(T memberFunctionPointer) //返回const重载

例子:

  1. struct Foo {
  2. void overloadedFunction(int, const QString &);
  3. void overloadedFunction(int, const QString &) const;
  4. };
  5. //针对const重载, 可以使用qConstOverload和qNonConstOverload
  6. ... qConstOverload<int, const QString &>(&Foo::overloadedFunction)
  7. ... qNonConstOverload<int, const QString &>(&Foo::overloadedFunction)
注意:qOverload 需要 C++14 支持. 因此针对 C++11, 可以使用 QOverload、QConstOverload、QNonConstOverload 辅助类
  1. struct Foo {
  2. void overloadedFunction();
  3. void overloadedFunction(int, const QString &);
  4. void overloadedFunction(int, const QString &) const;
  5. };
  6. ... QOverload<>::of(&Foo::overloadedFunction)
  7. ... QOverload<int, const QString &>::of(&Foo::overloadedFunction)
  8. ... QConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
  9. ... QNonConstOverload<int, const QString &>::of(&Foo::overloadedFunction)