Как правильно передать 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(); 
  }
}


Что я делаю не так?
  • Вопрос задан
  • 750 просмотров
Решения вопроса 1
@wxmaper Автор вопроса
Короче сделал так:

bool call(QWidget *qo, QMetaMethod metaMethod, QGenericReturnArgument *returnArgument)
{
    /* ... */
    return metaMethod.invoke(qo, *returnArgument);
}

void somefunction()
{
    void *vlayout;
    QGenericReturnArgument returnArgument(metaMethod.typeName(), &vlayout);

    if( call(qo, metaMethod, &returnArgument) ) {
        QLayout *layout = reinterpret_cast<QLayout*>(vlayout); 
        /* ... */
    }
}

работает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
maaGames
@maaGames
Погроммирую программы
QGenericReturnArgument returnArgument(metaMethod.typeName(), &data)

замена на

QGenericReturnArgument returnArgument(metaMethod.typeName(), *data)
Ответ написан
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.
Ответ написан
BuriK666
@BuriK666
Компьютерный псих
Внутри call
data у Вас имеет тип void **
а внутри somefunction - void *
QLayout *layout = reinterpret_cast<QLayout *>(&data); // Segfault
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы