首页 > 其他分享 >Qt开发总结1

Qt开发总结1

时间:2023-06-18 22:35:31浏览次数:49  
标签:总结 QByteArray Qt 开发 file const QDataStream 序列化 data

GUI界面

限制输入的内容

QValidator *validator = new QIntValidator(100, 999, this);
// 这样文本框只能输入100~999之间的数字
ui->lineEdit->setValidator(validator);

显示格式控制

ui->textEdit->setWordWrapMode(QTextOption::WrapAnywhere); // 任意地方换行
ui->tableWidget->setTextElideMode(Qt::ElideMode); // 不显示省略号

Qt序列化

通过全局流操作运算符重载实现,可以序列化到文件等设备中,也可以序列化到QByteArray中。

// cmdinfo.h
// BaseInfo已经实现序列化
class CmdInfo : public BaseInfo {
public:
    friend QDataStream& operator>>(QDataStream&, CmdInfo&);
    friend QDataStream& operator<<(QDataStream&, const CmdInfo&);

private:
    QString command_;
    CmdType type_;
};

// cmdinfo.cpp
QDataStream& operator>>(QDataStream &in, CmdInfo &data)
{
    BaseInfo &base = data;
    qint32 tmpInt;

    in >> base >> data.command_ >> tmpInt;
    data.setType((CmdType)tmpInt);
    return in;
}
QDataStream& operator<<(QDataStream &out, const CmdInfo &data)
{
    const BaseInfo &base = data;
    out << base << data.command_ << (qint32)data.type_;
    return out;
}

序列化到文件中

// 读
QFile file("object.dat");
file.open(QFile::ReadOnly);
QDataStream in(&file);
in >> infoObj;
file.close();

// 写
QFile file(datFilename(filename));
file.open(QFile::Truncate | QFile::WriteOnly);
QDataStream out(&file);
out << infoObj;
file.flush();
file.close();

序列化到QByteArray中

// The QBuffer class provides a QIODevice interface for a QByteArray.
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);

QDataStream out(&buffer);
out << QApplication::palette();

QDateTime也重载了关于QDateTimeQDebug的全局流操作符

class QDateTime {
    friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
    friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &);

    friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
};

QByteArray的Copy-On-Write

QByteArray can be used to store both raw bytes (including '\0's) and traditional 8-bit '\0'-terminated strings. Using QByteArray is much more convenient than using const char *. Behind the scenes, it always ensures that the data is followed by a '\0' terminator, and uses implicit sharing (copy-on-write) to reduce memory usage and avoid needless copying of data.

#include <QByteArray>
#include <QDebug>

int main()
{
    char buf[] = {'1', '2', 0, '3'};
    QByteArray ba1 = QByteArray::fromRawData(buf, 4);
    QByteArray ba2 = QByteArray(buf, 4); // 深拷贝
    qDebug() << ba2.size(); // 4
    // buf的地址和ba1.constData()的地址相同
    printf("buf=%p, ba1=%p, ba2=%p\n", buf, ba1.constData(), ba2.constData());

    // 注意: data()接口会触发深拷贝,而constData不会触发深拷贝
    ba1.data();
    printf("buf=%p, ba1=%p, ba2=%p\n", buf, ba1.constData(), ba2.constData());
    return 0;
}

// 输出:
// 4
// buf=0067fea4, ba1=0067fea4, ba2=012475d8
// buf=0067fea4, ba1=0124b6f8, ba2=012475d8

底层原理

// qbytearray.h

inline char *QByteArray::data()
{ detach(); return d->data(); }

inline const char *QByteArray::data() const
{ return d->data(); }

inline const char *QByteArray::constData() const
{ return d->data(); }

inline void QByteArray::detach()
{ if (d->ref.isShared() || (d->offset != sizeof(QByteArrayData))) reallocData(uint(d->size) + 1u, d->detachFlags()); }

标签:总结,QByteArray,Qt,开发,file,const,QDataStream,序列化,data
From: https://www.cnblogs.com/devin1024/p/17489874.html

相关文章

  • 知识总结
    jsp以reqBody传给后端后端用@RequestParam分别接收参数curl-XGET\http://bjfk-staging-ls508.yz02:9494/rest/infra/id/card/user/bind/account?uid=xxx&name=xxx&identity=xxx&appType=xxx后端使用@RequestParam分别承接几个参数即可@RequestParam只应用于content-type......
  • C++基础知识总结
    2023/6/18本篇章记录学习过程C++的基础概念和代码测试实现,还有很多需要补充。一是还不清楚,二是还没有学到。打算学习过程中后面再做补充。先看完《C++primer》书之后再慢慢来添加补充1.函数重载一个函数名可以实现多个功能,这取决于函数参数不同来实现判断对应的功能,与返回......
  • 本周总结(6.18)
    总结1、数据结构小学期第一阶段的四道题目全部完成啦!就是还需要进行一定的复习,以应对接下来的数据结构答辩啦!2、ppt和计划书仍旧在努力阶段3、小程序情况基本上完成了登录界面和主界面的内容,但是下面的内容还没有填.........
  • python+tkinter开发2048游戏
    1.界面设计如果开发这个游戏,相信一定玩过。这里不过多介绍。我最后的效果。2.代码importrandomimporttkinterastkfromtkinterimportmessageboxfromtkinter.constantsimportW,N,E,Sdefrandom_2()->bool:"""在空位置随机生成一个2:ret......
  • Vue 开发环境搭建
    1安装环境Node.jsjs的运行环境,相当于java的jvm官网:https://nodejs.org/en,下载最新稳定版18.16.0LTS,双击安装即可自动安装了npm,终端验证:C:\Users\Administrator>node-vv18.16.0C:\Users\Administrator>npm-v9.5.1npm=nodepackagemanager,js包的管理工具,相当......
  • BUAA OO 总结
    正向建模和开发本单元通过学习三种UML图,在具体写代码之前先对架构进行构建。理论上讲,这样是可以节省很多时间并优化架构的,但是我实际执行过程中,经常遇到原来的UML图架构考虑不周,而不得不根据代码反过来修改UML图,最后第一次作业基本上就和先写代码没有区别,好在第二,三次迭代时这样......
  • Redis的设计与实现-总结
    个人真的很喜欢这本书,从对C语言一窍不通,到发现C语言竟然如此简洁,以至于我喜欢上了C!对此前面的底层数据结构也读了几次,大致整理了书里的内容,后面的就粗略看了一下,不再细细整理了.Redis的设计与实现(1)-SDS简单动态字符串Redis的设计与实现(2)-链表Redis的设计与实......
  • 第三十节:EFCore7.x版本新功能总结
    一.linq改进1.GroupBy(1).可以直接GroupBy进行toList()输出了. PS:从EFCore3.x--6.x不能直接groupby进行输出了。(2).这种类型的GroupBy不会直接转换为SQL,因此EFCore对返回的结果进行分组。但是,这不会导致从服务器传输任何其他数据。toList()才会查询。(3).案......
  • 算法题总结-吃苹果(有序处理)
    原题https://leetcode.cn/problems/maximum-number-of-eaten-apples/有一棵特殊的苹果树,一连n天,每天都可以长出若干个苹果。在第i天,树上会长出apples[i]个苹果,这些苹果将会在days[i]天后(也就是说,第i+days[i]天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的......
  • 测量项目总结
    和朋友合作开发一个测量机产品,用于测量汽车零件形位公差,客户的客户是电动汽车第一品牌,我负责上位机开发,历时2个月,完成上百次的commit.时间虽紧,但代码质量上没有妥协,软件层次划分合理,后续考虑做成系列产品.开发利器感恩这个时代,现在的软件开发开发体验真好,可以......