我是QT的新手,我只是测试了MOC。 对于给定的类:
class Counter : public QObject
{
Q_OBJECT
int m_value;
public:
Counter() {m_value = 0;}
~Counter() {}
int value() {return m_value;}
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
};
我想得到一个类中所有方法的列表,但似乎只获得了一个信号和插槽列表,尽管documentation说它应该是所有方法?这是我的代码:
#include <QCoreApplication>
#include <QObject>
#include <QMetaMethod>
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
const QMetaObject cntmo = Counter::staticMetaObject;
for(int i = 0; i != cntmo.methodCount(); ++i)
{
QMetaMethod qmm(cntmo.method(i));
cout << qmm.signature() << endl;
}
return app.exec();
}
请注意这是我最好的c / p,也许我忘了包含一些标题。
我的输出:
destroyed(QObject*)
destroyed()
deleteLater()
_q_reregisterTimers(void*)
valueChanged(int)
setValue(int)
有谁知道为什么会这样? qt无法识别
int value() {return m_value;}
作为一种有效的方法?如果是这样,有没有我忘记的宏或类似的东西?
P.S。我正在使用4.6.2
更新
我忘记了setValue
方法的实现,而不是它对我的实际问题产生了太大的影响。
void Counter::setValue(int value)
{
if(value != m_value)
{
m_value = value;
emit valueChanged(value);
}
}
答案 0 :(得分:1)
据我所知,你不能通过QMetaObject访问QObject子类的所有方法,它只提供对signal,slots和INVOCABLE方法的访问:
class MyClass: public QObject {
Q_OBJECT
public:
Q_INVOCABLE int someMethod(const QString &someParam);
};
也许它还提供对Q_PROPERTY getter和setter的访问。更仔细地阅读有关Qt对象模型和元对象系统的文章。
来自QMetaObject类描述(http://doc.trolltech.com/4.6/qmetaobject.html#details)的报价:
“method()和methodCount()提供有关类的元方法(信号,槽和其他可调用成员函数)的信息。”
没有关于正常C ++方法访问的信息。实际上它很好,因为反射技术很慢。