Qt中的重载“<<“运算符

2024-09-03 03:04
文章标签 qt 重载 运算符

本文主要是介绍Qt中的重载“<<“运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

因为看到Qt中重载流操作符和C++中重载流操作符好像不一样,所以想研究一下。

正文

在C++中

//左移运算符的重载是<<
//为了实现直接打印对象
class Person
{
public:int m_a;int m_b;
};
//一般不会利用成员函数重载左移运算符,因为若是成员函数,则调用这个运算符就变成了p.operator<<(cout,p);这样就自己调用自己的成员函数并且把自己当做变量传递给函数
//而且调用的时候p.operator<<(cout)会被解释为p<<cout(因为是p调用的函数),为了使得cout在左侧
//故只能用全局函数重载<<
ostream& operator<<(ostream& cout, Person& p)//返回值是ostream&类型是为了实现cout后可以无限追加<<
{cout << "m_a = " << p.m_a << " m_b = " << p.m_b;return cout;
}
void test0()
{Person p1;p1.m_a = 13;p1.m_b = 23;cout << p1 << endl;}

不懂为什么的可以去看b站黑马视频

在Qt中

实现打印自定义类
#ifndef ARCHIEVEPRINT_H
#define ARCHIEVEPRINT_H#include <QObject>
#include <QDebug>class ArchievePrint : public QObject
{Q_OBJECT
public:explicit ArchievePrint(QObject *parent = nullptr);// 声明为友元函数friend QDebug operator<<(QDebug dbg, const ArchievePrint& obj);signals:private:int m_data;QString m_str;qreal m_fdata;
};#endif // ARCHIEVEPRINT_H//cpp
#include "archieveprint.h"ArchievePrint::ArchievePrint(QObject *parent): QObject(parent),m_data(10),m_str("hello qDebug"),m_fdata(3.0)
{}// 重载 QDebug 的 << 运算符
QDebug operator<<(QDebug dbg, const ArchievePrint& obj) {// 保存当前的 QDebug 状态QDebugStateSaver saver(dbg);dbg.nospace() << " m_data:" << obj.m_data << " m_str:" <<obj.m_str <<" m_fdata:" <<obj.m_fdata;return dbg.space();
}// main.cpp
#include <QCoreApplication>
#include "archieveprint.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ArchievePrint apt;qDebug()<< apt;return a.exec();
}

运行结果
在这里插入图片描述

实现自定义类的序列化和反序列化
#ifndef ARCHIEVESERIALIZATION_H
#define ARCHIEVESERIALIZATION_H#include <QObject>
#include <QTextStream>
#include <QDataStream>class ArchieveSerialization : public QObject
{Q_OBJECT
public:explicit ArchieveSerialization(QObject *parent = nullptr);ArchieveSerialization(qreal data,QObject *parent = nullptr);// 重载QTextStream的<<,用于序列化friend QTextStream& operator<<(QTextStream& out, const ArchieveSerialization& obj);// 重载QTextStream的>>,用于反序列化friend QTextStream& operator>>(QTextStream& in, ArchieveSerialization& obj);
// 这两个就不写了,和上面两个一样
//    // 重载QDataStream的<<,用于序列化
//    friend QDataStream& operator<<(QDataStream& out, const ArchieveSerialization& obj);
//    // 重载QDataStream的>>,用于反序列化
//    friend QDataStream& operator>>(QDataStream& in, ArchieveSerialization& obj);signals:private:qreal value;};#endif // ARCHIEVESERIALIZATION_H//cpp
#include "archieveserialization.h"ArchieveSerialization::ArchieveSerialization(QObject *parent) : QObject(parent)
{}ArchieveSerialization::ArchieveSerialization(qreal data,QObject *parent)
{value = data;
}QTextStream &operator>>(QTextStream &in, ArchieveSerialization &obj)
{in >> obj.value;return in;
}QTextStream &operator<<(QTextStream &out, const ArchieveSerialization &obj)
{out << obj.value;return out;
}// main.cpp
#include <QCoreApplication>
#include "archieveserialization.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ArchieveSerialization obj1(3.0), obj2(5.0), obj3(3.7);QTextStream out(stdout);out << "output data:"<<obj1<<" "<<obj2<<" "<<obj3<<endl;return a.exec();
}

运行结果
在这里插入图片描述

话题之外

"<<"">>"对于整形数据而言如 int, unsigned int, long, short 等就是左移、右移运算符号,左移一位相当于乘以2,移动3位相当于乘以8,右移一位相当于除以2,移动三位相当于除以8,如

    int a = 3, b = 23, c = 11, d = 234;a = a<<1;b = b>>1;c = c<<3;d = d>>3;qDebug()<<"a:"<<a<<" b:"<<b<<" c:"<<c<<" d:"<<d;//运行结果a: 6  b: 11  c: 88  d: 29

小结

我现在才明白我们根据我们所需要的功能进行重载,比如我想调用qDebug直接打印我自定义类的对象,那么我这个类就要重载QDebug<<操作符;当我想通过流操作符序列化和反序列化自定义类的内容时,就可以重载QTextStream 或者QDataStream 的流操作符。

这篇关于Qt中的重载“<<“运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131840

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义