Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Приведение типа внутри QVariant

Возможно заголовок выглядит несколько не понятно, поэтому перейду сразу к примеру:
double d = 3.14; QVariant v(d); qDebug() << v.value(); //3
QVariant выполнил приведение типа double -> int.
Я хочу провернуть то же самое, но с указателями:
class Foo : public QObject{ Q_OBJECT; }; Q_DECLARE_METATYPE(Foo*) static const int __idFoo = qRgisterMetaType("Foo*");
//...
Foo *foo = new Foo(); QVariant v = QVariant::fromValue(foo); qDebug() << v.value(); //QObject(0x0)
Приведение типа не произошло. Вопрос: Можно ли каким-нибудь образом поместить в QVariant указатель на объект производного класса, а извлечь указатель на объект базового класса?
UPD: Код почти такой же как и мой:
class IRow : public QObject{ //... };
class FirstRow : public IRow{ //... };
class SecondRow : public IRow{ FirstRow *_first Q_PROPERTY(FirstRow* first READ first WRITE setFirst) public: FirstRow* first() const{ return _first; } void first(FirstRow *first){ _first = first; } //... };
Где-то в другом месте есть функция, которая ничего не знает о конкретных реализациях интерфейса IRow. Она должна прочитать все доступные свойства, того объекта который к ней пришел в виде QVariant(по-другому никак, там работа с моделями идет), и привести полученное значение к типу интерфейса(IRow). И вот оно не приводится. В Qt5 должно, а в Qt4 - никак. Если воспользоваться решением @ixSci то класс SecondRow примет вид:
class SecondRow : public IRow{ FirstRow *_first Q_PROPERTY(FirstRow* first READ _first WRITE _setFirst) public: FirstRow* first() const{ return _first; } void first(FirstRow *first){ _first = first; } private: IRow* _first() const{ return first(); } void _setFirst(IRow *first){ _setFirst(qobject_cast(first)); } //... };
Оно работает, но количество сеттеров и геттеров удвоилось


Ответ

При тех данных, что Вы имеете, видимо, самый простой(если не единственный) вариант будет такой
QVariant v = QVariant::fromValue(static_cast(foo)); qDebug() << static_cast(v.value());
Можно для этого написать функции-обёртки, которые уменьшат количество кода. Что-нибудь такое:
QVariant ptrToQVariant(void* ptr) { return QVariant::fromValue(ptr); }
QObject* variantPtrToQObject(const QVariant& v) { return static_cast(v.value()); }
и потом:
QVariant v = ptrToQVariant(foo); qDebug() << variantPtrToQObject(v);

Комментариев нет:

Отправить комментарий