如何在Qt中使用自定义数据类型 - zhezhelin - 博客园

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

客园

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

Q_DECLARE_METATYPE,Qt自定义类型

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

复制代码

QVariant

为了能在QVariant中使用自定义数据类型做,需要使用

Q_DECLARE_METATYPE()来向Qt的元系统声明这个自定义类型。如下列所示:

复制代码

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

复制代码

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

复制代码

这样我们便可以像下面这样使用了:

复制代码

信号和槽

对于直接连接类型(默认情况下就是直接连接)而言,使用自定义数据类型做信号参数不需要做其他其他处理,就像内置数据类型一样:

复制代码

但在跨线程时如果你还这么做,编译器就会给出警告了:

复制代码

这时我们需要先注册Player:

qRegisterMetaType<Player>("Player");

qRegisterMetaType<Player>( ); (上面那个是错误的,除非名字刚好和类名一样)

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

复制代码

QDebug

最好是能这样:

复制代码

而不是这样:

复制代码

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

复制代码

QDataStream

跟上面的QDebug很像,我们也需要重载一下<<操作符:

复制代码

QSettings

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

复制代码

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

复制代码

复制代码

参考:

QString QSettingsPrivate::variantToString(const QVariant &v)

{

QString result;

switch (v.type()) {

case QVariant::Invalid:

result = QLatin1String("@Invalid()");

break;

case QVariant::ByteArray: {

QByteArray a = v.toByteArray();

result = QLatin1String("@ByteArray("); result += QString::fromLatin1(a.constData(), a.size()); result += QLatin1Char(')');

break;

}

case QVariant::String:

case QVariant::LongLong:

case QVariant::ULongLong:

case QVariant::Int:

case QVariant::UInt:

case QVariant::Bool:

case QVariant::Double:

case QVariant::KeySequence: {

result = v.toString();

if (result.startsWith(QLatin1Char('@')))

result.prepend(QLatin1Char('@'));

break;

}

#ifndef QT_NO_GEOM_VARIANT

case QVariant::Rect: {

QRect r = qvariant_cast<QRect>(v);

result += QLatin1String("@Rect(");

result += QString::number(r.x());

result += QLatin1Char(' ');

result += QString::number(r.y());

result += QLatin1Char(' ');

result += QString::number(r.width());

result += QLatin1Char(' ');

result += QString::number(r.height());

result += QLatin1Char(')');

break;

}

case QVariant::Size: {

QSize s = qvariant_cast<QSize>(v);

result += QLatin1String("@Size("); result += QString::number(s.width());

result += QLatin1Char(' ');

result += QString::number(s.height());

result += QLatin1Char(')');

break;

}

case QVariant::Point: {

QPoint p = qvariant_cast<QPoint>(v);

result += QLatin1String("@Point("); result += QString::number(p.x());

result += QLatin1Char(' ');

result += QString::number(p.y());

result += QLatin1Char(')');

break;

}

相关文档
最新文档