当 QDataStream 没有这种方法时,为啥可以将 QVariant 写入 QDataStream?

Posted

技术标签:

【中文标题】当 QDataStream 没有这种方法时,为啥可以将 QVariant 写入 QDataStream?【英文标题】:Why is it possible to write QVariant to QDataStream when QDataStream dosen't have such method?当 QDataStream 没有这种方法时,为什么可以将 QVariant 写入 QDataStream? 【发布时间】:2014-11-09 03:36:18 【问题描述】:

我可以毫无问题地将 QVariant 写入 QDataStream 并从 QDataStream 读取 QVariant。

QByteArray byteArray;

QDataStream outStream(&byteArray, QIODevice::WriteOnly);
QVariant outVar(QString("hello"));
outStream << outVar;

QVariant inVar;
QDataStream inStream(&byteArray, QIODevice::ReadOnly);
inStream >> inVar;

我的问题是,当 QDataStream 没有方法 operator&lt;&lt;(QVariant v) 时,上面的代码如何编译和正常工作?

【问题讨论】:

运算符可以在类外声明。 【参考方案1】:

因为operator&lt;&lt; 是在QVariant 中声明的。

根据QDataStream,

除了此处记录的重载流运算符之外,您可能希望序列化为 QDataStream 的任何 Qt 类都将具有适当的流运算符声明为该类的非成员。

在 QVariant 的源代码中,你可以找到两个非成员函数(很遗憾,它们没有在 QVariant 的文档中列出):

QDataStream& operator<<(QDataStream &s, const QVariant &p)
QDataStream& operator>>(QDataStream &s, QVariant &p)

【讨论】:

以上是关于当 QDataStream 没有这种方法时,为啥可以将 QVariant 写入 QDataStream?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当objective-c 有冲突返回类型时会发生这种情况?

为啥以这种方式使用 Alamofire 时没有发现任何价值?

6.5 QDataStream串行化数据流处理

为啥当代码有效时 JQuery .val() 方法有时会返回 undefined? [复制]

如何使用 QTextStream 而不是 QDataStream 从 QTableView 进行加载保存?

当 @BeforeTest 方法失败时,为啥它没有在 testng-failed.xml 中列出?