例如我有这段代码:
class MyClass : public QObject
{
Q_OBJECT
public:
void MyClass()
{
QStringList selfFunctionList;
//Get functions list
qDebug()<<selfFunctionList;
}
void function1(){}
void function435(){}
};
如何设置“function1”和“function435”的selfFunctionList列表?
答案 0 :(得分:3)
您可以使用 staticMetaObject 。
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QObject *parent = 0) :
QObject(parent)
{
for (int n = 0; n < staticMetaObject.methodCount(); n++) {
functions.append(QString::fromLocal8Bit(staticMetaObject.method(n).name()));
}
qDebug() << functions;
}
signals:
void testSignal();
private slots:
void privateTestFunction() {}
public slots:
void publicTestFunction() {}
private:
QStringList functions;
};
一个条件是,函数需要声明为槽或信号。
<强>输出:强>
("destroyed","destroyed","objectNameChanged","deleteLater","_q_reregisterTimers",
"testSignal","privateTestFunction","publicTestFunction")
答案 1 :(得分:0)
C ++没有你似乎想要的那种自我意识(reflection)。也就是说,没有编程方法来获取函数的字符串名称并将其输入到容器中而无需手动编码。 Qt的信号和插槽的数量非常有限,但通常不是功能。所以你必须写
MyClass::MyClass(...)
{
selfFunctionList << function1 << function345 << ... etc.
}
作为构造函数,或类似的东西。
编辑:OP给我注意了these macros,这给了你一些内省,但实现它们以解决OP的问题会比上面的更加艰巨,请参阅评论。