本文转载至: http://blog.163.com/jx_yp/blog/static/1197044592011119105843436/
这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样):
- struct Player
- {
- int number;
- QString firstName;
- QString lastName;
- };
为了能在QVariant中使用自定义数据类型做,需要使用 Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示:
- struct Player
- {
- ...
- };
- Q_DECLARE_METATYPE(Player);
- Player player;
- object->setProperty("property", QVariant::fromValue(player));
- struct Player
- {
- ...
- operator QVariant() const
- {
- return QVariant::fromValue(*this);
- }
- };
- Player player;
- object->setProperty("property", player);
对于直接连接类型(默认情况下就是直接连接)而言,使用自定义数据类型做信号参数不需要做其他其他处理,就像内置数据类型一样:
- connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));
- QObject::connect: Cannot queue arguments of type 'Player'
- (Make sure 'Player' is registered using qRegisterMetaType().)
- qRegisterMetaType<Player>("Player");
- connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));
最好是能这样:
- qDebug() << player;
- qDebug() << "Player(" << player.number << "," << player.firstName << "," << player.lastName << ")";
- inline QDebug operator<<(QDebug debug, const Player& player)
- {
- debug.nospace() << "Player("
- << player.number << ","
- << player.firstName << ","
- << player.lastName << ")";
- return debug.space();
- }
跟上面的QDebug很像,我们也需要重载一下<<操作符:
- inline QDataStream& operator<<(QDataStream& out, const Player& player)
- {
- out << player.number;
- out << player.firstName;
- out << player.lastName;
- return out;
- }
- inline QDataStream& operator>>(QDataStream& in, Player& player)
- {
- in >> player.number;
- in >> player.firstName;
- in >> player.lastName;
- return in;
- }
为了能在QSettings中使用自定义数据类型,需要让Qt的元系统知道有此类型,就像上面介绍QVariant部分一样,另外还要提供相应的QDataStream操作符,还必须注册这个流操作符:
- qRegisterMetaTypeStreamOperators<Player>("Player");
- QSettings settings;
- Player player;
- settings.setValue("key", player);
- QSettings settings;
- Player player = value("key").value<Player>();