您的位置:首页 > 编程语言 > Qt开发

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

2012-08-07 07:15 741 查看
本文转载至: http://blog.163.com/jx_yp/blog/static/1197044592011119105843436/
这里我们使用下面这个struct来做说明(这里不管是struct还是class都一样):

struct Player

{

int number;

QString firstName;

QString lastName;

};

QVariant

为了能在QVariant中使用自定义数据类型做,需要使用Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示:

struct Player

{

...

};

Q_DECLARE_METATYPE(Player);

在作为QVariant传递自定义数据类型时,需要使用QVariant::fromValue()或者qVariantFromValue:

Player player;

object->setProperty("property", QVariant::fromValue(player));

为了更方便一点,你可以在自定义类型中定义一个QVariant() 类型转换符:

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().)

这时我们需要先注册Player:

qRegisterMetaType<Player>("Player");

connect(sender, SIGNAL(playerCreated(const Player&)), receiver, SLOT(addPlayer(const Player&)));

QDebug

最好是能这样:

qDebug() << player;

而不是这样:

qDebug() << "Player(" << player.number << "," << player.firstName << "," << player.lastName << ")";

怎么做呢?我们需要对QDebug<<操作符重载一下:

inline QDebug operator<<(QDebug debug, const Player& player)

{

debug.nospace() << "Player("

<< player.number << ","

<< player.firstName << ","

<< player.lastName << ")";

return debug.space();

}

QDataStream

跟上面的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

为了能在QSettings中使用自定义数据类型,需要让Qt的元系统知道有此类型,就像上面介绍QVariant部分一样,另外还要提供相应的QDataStream操作符,还必须注册这个流操作符:

qRegisterMetaTypeStreamOperators<Player>("Player");

如此处理之后我们就可以像下面这样使用了:

QSettings settings;

Player player;

settings.setValue("key", player);

QSettings settings;

Player player = value("key").value<Player>();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: