缺少常规方法的QMetaMethods?

时间:2010-04-28 12:31:35

标签: c++ qt

我是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);
    }
}

1 个答案:

答案 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 ++方法访问的信息。实际上它很好,因为反射技术很慢。