找回密码
 立即注册
收起左侧

QPointer<QObject> 与 QVraint 的串行化问题

3
回复
7640
查看
[复制链接]
累计签到:1 天
连续签到:1 天
来源: 2016-2-18 14:59:55 显示全部楼层 |阅读模式
5Qter豆
如下代码:

#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类型。








回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-2-18 16:35:30 显示全部楼层
此问题可有偿付费,请私聊。
回复

使用道具 举报

累计签到:12 天
连续签到:1 天
2016-2-22 09:17:37 显示全部楼层
如果你是qt4.8版本就没办法啦...
4.8的写死用 static void streamDebug(QDebug dbg, const QVariant &v) 去搞 QVariant 的输出
其他版本的qt我就不知道啦...
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-2-22 12:46:05 显示全部楼层
shencj1234 发表于 2016-2-22 09:17
如果你是qt4.8版本就没办法啦...
4.8的写死用 static void streamDebug(QDebug dbg, const QVariant &v) 去 ...

5.5 的版本

[General]
RefereObjA=@Invalid()
RefereObj=@Variant(\0\0\0\x7f\0\0\0\x6PXObj\0\0\0\0\nobj_refer\0)
ID=1000
RefereObjList=@Variant(\0\0\0\x7f\0\0\0\rQList<PXObj>\0\0\0\0\x2\0\0\0\nobj_refer\0\0\0\0\nobj_refer\0)

QSettings 的输出  有问题    Debug 部分可以了

QVariant(PXObj, <PXObj> "obj")
QVariant(QList<PXObj>, (<PXObj> "objA", <PXObj> "obj"))
QVariant(int, 1000)
<PXObj> "obj"
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了