如何在Qt中使用自定义数据类型

本文转载至: http://blog.163.com/jx_yp/blog/static/1197044592011119105843436/


这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样):

  1. struct Player
  2. {
  3.     int number;
  4.     QString firstName;
  5.     QString lastName;
  6. };
QVariant
为了能在QVariant中使用自定义数据类型做,需要使用 Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示:
  1. struct Player
  2. {
  3.     ...
  4. };
  5. Q_DECLARE_METATYPE(Player);
在作为QVariant传递自定义数据类型时,需要使用QVariant::fromValue()或者qVariantFromValue:
  1. Player player;
  2. object->setProperty("property", QVariant::fromValue(player));
为了更方便一点,你可以在自定义类型中定义一个QVariant() 类型转换符:
  1. struct Player
  2. {
  3.     ...
  4.     operator QVariant() const
  5.     {
  6.         return QVariant::fromValue(*this);
  7.     }
  8. };
这样我们便可以像下面这样使用了:
  1. Player player;
  2. object->setProperty("property", player);
信号和槽
对于直接连接类型(默认情况下就是直接连接)而言,使用自定义数据类型做信号参数不需要做其他其他处理,就像内置数据类型一样:
  1. connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));
但在跨线程时如果你还这么做,编译器就会给出警告了:
  1. QObject::connect: Cannot queue arguments of type 'Player'
  2. (Make sure 'Player' is registered using qRegisterMetaType().)
这时我们需要先注册Player:
  1. qRegisterMetaType<Player>("Player");
  2. connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));
QDebug
最好是能这样:
  1. qDebug() << player;
而不是这样:
  1. qDebug() << "Player(" << player.number << "," << player.firstName << "," << player.lastName << ")";
怎么做呢?我们需要对QDebug<<操作符重载一下:
  1. inline QDebug operator<<(QDebug debug, const Player& player)
  2. {
  3.         debug.nospace() << "Player("
  4.                 << player.number << ","
  5.                 << player.firstName << ","
  6.                 << player.lastName << ")";
  7.         return debug.space();
  8. }
QDataStream
跟上面的QDebug很像,我们也需要重载一下<<操作符:
  1. inline QDataStream& operator<<(QDataStream& out, const Player& player)
  2. {
  3.     out << player.number;
  4.     out << player.firstName;
  5.     out << player.lastName;
  6.     return out;
  7. }
  8. inline QDataStream& operator>>(QDataStream& in, Player& player)
  9. {
  10.     in >> player.number;
  11.     in >> player.firstName;
  12.     in >> player.lastName;
  13.     return in;
  14. }
QSettings
为了能在QSettings中使用自定义数据类型,需要让Qt的元系统知道有此类型,就像上面介绍QVariant部分一样,另外还要提供相应的QDataStream操作符,还必须注册这个流操作符:
  1. qRegisterMetaTypeStreamOperators<Player>("Player");
如此处理之后我们就可以像下面这样使用了:
  1. QSettings settings;
  2. Player player;
  3. settings.setValue("key", player);
  1. QSettings settings;
  2. Player player = value("key").value<Player>();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值