5 Qter豆
如下代码:
#include <QPointer>
#include <QList>
#include <QObject>
#include <QMetaObject>
class XObj;
class XObjA;
class XContainer;
typedef QPointer<XObj> PXObj;
typedef QPointer<XObjA> PXObjA;
Q_DECLARE_METATYPE(PXObj)
Q_DECLARE_METATYPE(PXObjA)
//////////////////////////////////////////////////////////////////////////////////////////////////
#define AXT_DECLARE_PROPERTY(_type,_name,_visible,_editable) \
Q_PROPERTY(_type _name READ get##_name WRITE set##_name RESET reset##_name NOTIFY changed##_name DESIGNABLE _visible USER _editable)
#define AXT_IMPLEMENT_PROPERTY(_type,_name,_default) \
public:\
void set##_name(_type const &val){m_prop##_name = val;};\
_type const & get##_name() const {return m_prop##_name;};\
void reset##_name(){set##_name(_default);};\
protected:\
_type m_prop##_name;
//////////////////////////////////////////////////////////////////////////////////////////////////
class XObj:public QObject
{
Q_OBJECT
public:
XObj(){};
};
class XObjA:public XObj
{
Q_OBJECT
public:
XObjA(){};
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
inline QDebug operator<<(QDebug debug, const PXObj &obj)
{
const bool oldSetting = debug.autoInsertSpaces();
if(obj)
debug.nospace() << "<PXObj> " << obj->objectName();
else
debug.nospace() << "<PXObj> NULL";
debug.setAutoInsertSpaces(oldSetting);
return debug.maybeSpace();
}
inline QDataStream& operator<<(QDataStream& out, const PXObj& obj)
{
if(obj)
out << obj->objectName();
else
out << "NULL";
return out;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
class XContainer:public XObj
{
Q_OBJECT
AXT_DECLARE_PROPERTY(PXObjA,RefereObjA,true,true)
AXT_DECLARE_PROPERTY(PXObj,RefereObj,true,true)
AXT_DECLARE_PROPERTY(int,ID,true,true)
public:
XContainer(){
// 属性测试赋值
PXObjA objA = PXObjA(new XObjA());
objA->setObjectName("objA");
PXObj obj = PXObj(new XObj());
obj->setObjectName("obj");
setProperty("RefereObj",qVariantFromValue<PXObj>(obj));
setProperty("RefereObjA",qVariantFromValue<PXObjA>(objA));
};
// ??????????????????????????????????????
void PrintProperties()
{
// 测试打印所有属性
const QMetaObject* mo = metaObject();
int pc = mo->propertyCount();
int of = mo->propertyOffset();
for(int i=of;i<pc;i++){
QMetaProperty& mp = mo->property(i);
QVariant var = property(mp.name());
qDebug() << var;
//int ut = var.userType();
//if(var.type() == QVariant::UserType
// && QMetaType::typeFlags(var.d.type)&QMetaType::TrackingPointerToQObject){
// PXObj po = var.value<PXObj>();
// qDebug() << po;
//}else{
// qDebug() << var;
//}
}
// 直接打印(不通过QVariant)
qDebug()<<getRefereObj();
qDebug()<<(PXObj)getRefereObjA();
};
// ??????????????????????????????????????
signals:
void changedRefereObj(const PXObj& val);
void changedRefereObjA(const PXObjA& val);
void changedID(const int& val);
AXT_IMPLEMENT_PROPERTY(PXObjA,RefereObjA,PXObjA())
AXT_IMPLEMENT_PROPERTY(PXObj,RefereObj,PXObj())
AXT_IMPLEMENT_PROPERTY(int,ID,0)
};
// 如上打印结果为
QVariant(PXObjA, ) // PXObjA,PXObj 没有正确打印出来,调试发现setProperty是成功的。 ????????
QVariant(PXObj, ) // PXObjA,PXObj 没有正确打印出来,调试发现setProperty是成功的。 ????????
QVariant(int, 1000)
<PXObj> "obj" // 直接打印(不通过QVariant) 成功打印
<PXObj> "objA" // 直接打印(不通过QVariant) 成功打印
// 问题:
如何向内置数据类型一样打印 QXObj 和 QXObjA ?
qDebug << QVariant 支持QXObj类型。
我来回答