Методы Q_PROPERTY не могут быть вызваны с использованием QMetaObject :: invokeMethod () - PullRequest
1 голос
/ 21 октября 2011

Добрый день!

Из документов Qt 4.7.3 не ясно, могут ли свойства вызываться с использованием QMetaObject :: invokeMethod () или нет.Но что действительно странно, что оба вызова потерпели неудачу:

class A : public QObject
{
  Q_OBJECT

  public:

    Q_PROPERTY( int value READ value )

    int value() { return 0; }

    Q_PROPERTY( int invokableValue READ invokableValue )

    Q_INVOKABLE int invokableValue() { return 0; }
};

...

int returnValue;

QMetaObject::invokeMethod( aPtr, "value"
                           , Q_RETURN_ARG( int, returnValue ) );

QMetaObject::invokeMethod( aPtr, "invokableValue"
                           , Q_RETURN_ARG( int, returnValue ) );

Это означает, что Q_PROPERTY запрещает использование Q_INVOKABLE.

Давайте посмотрим a_moc.cpp:

      if (_c == QMetaObject::InvokeMetaMethod) {
    // no calls here
    }
    #ifndef QT_NO_PROPERTIES
      else if (_c == QMetaObject::ReadProperty) {
    void *_v = _a[0];
    switch (_id) {
    case 0: *reinterpret_cast< int*>(_v) = value(); break;
    case 1: *reinterpret_cast< int*>(_v) = invokableValue(); break;
    }

Iдумаю, пришло время сообщить об ошибке и запросе функции, но, может быть, каким-то образом эти проблемы могут быть решены?

ОБНОВЛЕНИЕ:

Ошибка сообщение .

Предложение * 1020 сообщили *.

1 Ответ

2 голосов
/ 21 октября 2011

Проблема в том, что moc не является полноценным синтаксическим анализатором C ++ и может легко неправильно интерпретировать ваш код.

Он не видит макрос Q_INVOKABLE, потому что онсразу после объявления Q_PROPERTY.Если вы добавите точку с запятой после свойства (подсветка синтаксиса QtCreator не понравится), или если вы измените порядок строк, он будет работать правильно.

Так, например, работает следующий код:

class A : public QObject
{
    Q_OBJECT
    Q_PROPERTY( int value READ value )
    Q_PROPERTY( int invokableValue READ invokableValue )
public:
    int value() { return 0; }
    Q_INVOKABLE int invokableValue() { return 0; }
};

Но я не уверен, почему вы хотите иметь вызываемое свойство, поскольку вы уже можете прочитать любое свойство с помощью QObject::property.

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