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

相关文章

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 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自