Возможно заголовок выглядит несколько не понятно, поэтому перейду сразу к примеру:
double d = 3.14;
QVariant v(d);
qDebug() << v.value
QVariant выполнил приведение типа double -> int.
Я хочу провернуть то же самое, но с указателями:
class Foo : public QObject{
Q_OBJECT;
};
Q_DECLARE_METATYPE(Foo*)
static const int __idFoo = qRgisterMetaType
//...
Foo *foo = new Foo();
QVariant v = QVariant::fromValue(foo);
qDebug() << v.value
Приведение типа не произошло.
Вопрос: Можно ли каким-нибудь образом поместить в 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
Оно работает, но количество сеттеров и геттеров удвоилось
Ответ
При тех данных, что Вы имеете, видимо, самый простой(если не единственный) вариант будет такой
QVariant v = QVariant::fromValue(static_cast
Можно для этого написать функции-обёртки, которые уменьшат количество кода. Что-нибудь такое:
QVariant ptrToQVariant(void* ptr)
{
return QVariant::fromValue(ptr);
}
QObject* variantPtrToQObject(const QVariant& v)
{
return static_cast
и потом:
QVariant v = ptrToQVariant(foo);
qDebug() << variantPtrToQObject(v);
Комментариев нет:
Отправить комментарий