QMetaMethods для обычных методов отсутствует? - PullRequest
0 голосов
/ 28 апреля 2010

Я новичок в 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);
};

Я хочу получить список всех методов в классе, но, похоже, получаю только список сигналов и слотов, хотя документация говорит, что это должны быть все методы? Вот мой код:

#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();
}

Пожалуйста, будьте осторожны, это мой лучший к / п, возможно, я забыл включить некоторые заголовки.

Мой вывод:

destroyed(QObject*)
destroyed()
deleteLater()
_q_reregisterTimers(void*)
valueChanged(int)
setValue(int)

Кто-нибудь знает, почему это происходит? Qt не распознает

int value() {return m_value;}

как допустимый метод? Если так, то есть макрос, который я забыл или что-то в этом роде?

P.S. Я использую 4.6.2

UPDATE

Я забыл о реализации метода setValue, но это не слишком сильно меняет мой фактический вопрос.

void Counter::setValue(int value)
{
    if(value != m_value)
    {
        m_value = value;
        emit valueChanged(value);
    }
}

1 Ответ

1 голос
/ 28 апреля 2010

Насколько я помню, вы не можете получить доступ ко всем методам подкласса QObject через QMetaObject, он предоставляет доступ только для сигналов, слотов и методов INVOCABLE:

class MyClass: public QObject {
    Q_OBJECT
    public:
        Q_INVOCABLE int someMethod(const QString &someParam);
};

Возможно, это также обеспечивает доступ к получателям и установщикам Q_PROPERTY. Читайте статьи об объектной модели Qt и мета-объектной системе более внимательно.

Цитата из описания класса QMetaObject (http://doc.trolltech.com/4.6/qmetaobject.html#details):

"method () и methodCount () предоставляют информацию о мета-методах класса (сигналах, слотах и ​​других вызываемых функциях-членах)."

Нет информации о доступе к обычным методам C ++. И на самом деле это хорошо, так как рефлексивные методы медленные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...