如何在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>();
这里我们使用下面这个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>();
相关文章推荐
- 如何在Qt中使用自定义数据类型 (zz)
- 如何在Qt中使用自定义数据类型
- 如何在Qt中使用自定义数据类型
- 如何在Qt中使用自定义数据类型
- Qt-信号和槽中使用自定义数据类型
- 如何让QVariant使用自定义的数据类型?
- QT 4.7 DBUS Binding如何支持自定义数据类型的传输(一)
- golang(cgo)---如何在两个不同的package中使用同样的自定义数据类型?
- Qt-信号和槽中使用自定义数据类型
- Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
- CArray使用简单介绍,如何添加标准数据类型,和自定义的类,或者自定义数据类型
- 利用Qt的QSetting类存储自定义数据类型所需准备 4000
- Java中如何使用引用数据类型中的类呢?
- MySQL中日期类型数据的使用:如何让字段保存记录的创建时间和最后修改时间
- 自学C++之自定义数据类型与自定义类之数组使用4例
- 不使用sizeof,如何求出数据类型的字节数
- 如何处理BLOB类型数据之三:使用Servlet在页面上显示BLOB中的图片
- 在MapReduce的Map和Reduce过程中使用自定义数据类型
- oracle pl/sql中使用自定义数据类型
- 使用MFC的CArray自定义数据类型,编译报错的解决方法