Qt-有没有一种方法可以获得一个类中所有自定义插槽和信号的列表

Qt - Is there a way to get a list of all custom slots and signals in a class

本文关键字:自定义 插槽 信号 列表 方法 一种 有没有 Qt- 一个      更新时间:2023-10-16

我想获得所有自定义(不是从基类继承的)插槽和信号的列表。这可能吗?还是我必须手动执行?

通常,插槽/信号具有名称(const *),实际上可以使用该名称作为参数传递给函数,函数内部可以使用这些名称来建立/删除给定的插槽信号连接。

我想得到所有这些的原因是自动生成一组QGraphicsItems,它们将表示QGraphicsProxyWidget的输入(槽)和输出(信号)。这些输入和输出用于连接到其他此类节点(代理窗口小部件+输入+输出)。通过这样做,添加一个新的自定义节点将变得非常容易。

您可以为此使用QMetaObject。使用迭代方法

QMetaMethod   method(int index) const
int   methodCount() const

并检查CCD_ 5 的CCD_

MethodType QMetaMethod::methodType() const

返回此方法的类型(信号、槽或方法)。

编辑:

您可能想要使用

int QMetaObject::methodOffset() const 

返回此类的方法偏移量;即该类的第一个成员函数的索引位置。

跳过基类中的方法。


示例:(完整答案来自@rbaleksandar)

对于给定的类别MyClass,do:

MyClass test;
QMetaObject *moTest = test.metaObject();
QList<QString> slotSignatures;
QList<QString> signalSignatures;
// Start from MyClass members
for(int methodIdx = moTest->methodOffset(); methodIdx < moTest->methodCount(); ++methodIdx) {
  QMetaMethod mmTest = moTest->method(methodIdx);
  switch((int)mmTest.methodType()) {
    case QMetaMethod::Signal:
      signalSignatures.append(QString(mmTest.methodSignature())); // Requires Qt 5.0 or newer
      break;
    case QMetaMethod::Slot:
      slotSignatures.append(QString(mmTest.methodSignature())); // Requires Qt 5.0 or newer
      break;
  }
}
// Just to visualize the contents of both lists
cout << "Slots:" << endl;
foreach(QString signature, slotSignatures) cout << "t" << signature.toStdString() << endl;
cout << "Signals:" << endl;
foreach(QString signature, signalSignatures) cout << "t" << signature.toStdString() << endl;