Общая часть (создание библиотеки) моего проекта в настоящее время содержит интерфейсный класс типа:
class CanBeAddedToGroup{
public:
void addToGroup(Group& )=0;
}
Теперь я также хотел использовать программу в классе, содержащем данные в QVariant, поэтомуя начал с простого:
class DataContainingClass: public CanBeAddedToGroup{
QMap<QString,QVarient> data;
public:
void addToGroup(Group& ){
QMap<QString,QVarient>::itterator itter = data.begin();
QMap<QString,QVarient>::itterator end= data.end();
for(;itter !=end;itter ++){
<Handle Data>
}
}
};
}
Теперь один из типов данных, добавляемых в список (вне библиотеки), имеет тип:
class DataClass: public QObject, public CanBeAddedToGroup{
void addToGroup(Group& );
}
Q_DECLARE_METATYPE(DataClass)
И он добавляется на карту.используя «QVariant :: fromValue (», теперь мне нужен путь в «DataConistingClass», чтобы проверить, получены ли данные из QObject, поэтому я знаю, что static_cast (variable.data ()) действителен. Тогда я мог бы попытаться выполнить dynamic_castуказатель объекта на CanBeAddedToGroup и вызов его.
--- EDIT ---: Проблема НЕТ: наличие QObject и проверка, наследует ли он другой QObject, даже не проверяет, наследует ли класс отдругой - узнать, действительно ли данные, которые у меня есть, являются QObject.
Минимальный пример: Заголовочный файл:
#include <QObject>
#include <QDebug>
class DmbClass: public QObject{
Q_OBJECT
public:
DmbClass(){TST="RealOne";}
DmbClass(const DmbClass&d){TST="Clone";}
QString TST;
};
Q_DECLARE_METATYPE(DmbClass)
class Tst{
public:
virtual void tstFunct()=0;
};
class CanClass: public QObject, public Tst{
Q_OBJECT
public:
CanClass(){TST="RealOne";}
CanClass(const CanClass&d){TST="Clone";}
QString TST;
virtual void tstFunct() override{
qDebug()<<"tst";
}
};
Q_DECLARE_METATYPE(CanClass)
class DmbGadget{
Q_GADGET
public:
DmbGadget(){TST="RealOne";}
DmbGadget(const DmbGadget&d){TST="Clone";}
QString TST;
};
Q_DECLARE_METATYPE(DmbGadget)
C Файл:
// QObject in QVariant
DmbClass dC;
QVariant varC=QVariant::fromValue(dC);
const void* vPC = varC.data();
DmbClass dCc = varC.value<DmbClass>();
QObject* objC = (QObject*)varC.data();
QObject* schouldWork = objC->parent();
Tst* schouldBeNull = dynamic_cast<Tst*>(objC);
// Object using correct base class in QVariant
CanClass dT;
QVariant varT=QVariant::fromValue(dT);
const void* vPT = varT.data();
CanClass dTc = varC.value<CanClass>();
QObject* objT = (QObject*)varT.data();
QObject* schouldWork2 = objT->parent();
Tst* schouldNotNull = dynamic_cast<Tst*>(objT);
schouldNotNull->tstFunct();
// Q_Gadget in QVariant
DmbGadget dG;
QVariant varG=QVariant::fromValue(dG);
const void* vPG = varG.data();
DmbGadget dGg = varG.value<DmbGadget>();
QObject* objD = (QObject*)varG.data();
//QObject* schouldSegFault = objD->parent();
// base value in QVariant
QVariant var4=4;
const void* vP4 = var4.data();
QObject* obj4 = (QObject*)var4.data();
//QObject* schouldSegFault2 = obj4 ->parent();
Мне нужен способ отличить случаи 1 и 2 от 3 и 4 ("schouldSegОшибка "), без использования чего-либо, определенного только за пределами библиотеки.
Я уже пробовал:
int tst4 = qRegisterMetaType<CanClass>("CanClass");
QMetaType help2(tst4);
Но help2 имеет MetaObject, равный 0, поэтому я не могу проверить наследование от QObject.
Редактировать / для того, кто добавил " Правильный способ проверки типа производного класса QObject в Qt ", в моей программе была проблема, что класс наследует от другого QObject
класса, поэтому я не могуЧак за наследование моего интерфейса (даже если он определен как Q_Gadget) с использованием наследников, поскольку это будет верно только для первого элемента.
PS: Для всех, кто пытается вызывать функции в QVariant, содержащем объект, а неуказатель может быть заинтересован в таком подходе: Как поддерживать сравнения для объектов QVariant, содержащих пользовательский тип? / https://pastebin.com/tNLa0jSa
Хотя наличие глобального реестра для типов - это то, чего я хотел бы избежатьдля дела.