Задать вопрос

Как правильно передать void в функцию (C++/Qt)?

Есть вот такой код. В качестве примера пытаюсь вызвать метаметод layout() у наследника от QWidget (Q_INVOKABLE установлен).
В функции call() все нормально работает, но в somefunction() переменная *data приходит сломанной или пустой:

bool call(QObject *qo, QMetaMethod metaMethod, void **data) {
  QGenericReturnArgument returnArgument(metaMethod.typeName(), &data);
  bool ok = metaMethod.invoke(qo, Qt::DirectConnection, returnArgument);
 
  if(ok) {
    QLayout *layout = reinterpret_cast<QLayout *>(data); // Всё ок
    qDebug() << layout ->metaObject()->className(); // QLayout
  }
 
  return ok;
}
 
void somefunction() {
  /* ... */
  void *data;
  bool ok = call( qo, metaMethod, &data );
 
  if(ok) {
    QLayout *layout = reinterpret_cast<QLayout *>(data); // Segfault
    qDebug() << layout ->metaObject()->className(); 
  }
}


Что я делаю не так?
  • Вопрос задан
  • 769 просмотров
Подписаться 1 Оценить 4 комментария
Ответ пользователя jcmvbkbc К ответам на вопрос (4)
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Думаю, что должно быть так:
bool call(QObject *qo, QMetaMethod metaMethod, void **data) {
  QGenericReturnArgument returnArgument(metaMethod.typeName(), data);
  bool ok = metaMethod.invoke(qo, Qt::DirectConnection, returnArgument);
 
  if(ok) {
    QLayout *layout = reinterpret_cast<QLayout *>(*data); // Всё ок
    qDebug() << layout ->metaObject()->className(); // QLayout
  }
 
  return ok;
}

Т.е. ваша ошибка в том, что вместо переданного из somefunction data вы используете локальную копию data из call.
Ответ написан