首页 > 代码库 > 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(


  1. 新建项目13IO

13IO.pro

HEADERS+=\

   MyWidget.h

 

SOURCES+=\

   MyWidget.cpp

 

QT+=gui widgets network

CONFIG+=C++11

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
 
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);
 
signals:
 
public slots:
 
};
 
#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"
#include <QFile>
#include <QApplication>
//#include <QDebug>
//#include <QBuffer>
//#include <QLabel>
//#include <QTextStream>
//#include <QDataStream>
 
/**
 * QFile
 * QBuffer     //memory file
 * QTcpSocket
 * QUdpSocket
 *
 * QDataStream
 * QTextStream
 */
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    //QT中不建议使用char *这种类型的数据类型
    QFile file("../MyTest.txt");
    file.open(QIODevice::ReadWrite);
 
    file.write(QByteArray("abc"));
    //同样,QFile中也有如下方法
    //file.seek();
    //file.write();
    file.close();
}
 
int main(int argc,char** argv)
{
    QApplication app(argc,argv);
 
    MyWidget w;
    w.show();
 
    return app.exec();
}

运行结果:

生成的MyTest.txt文件的内容如下:

 

2关于QBuffer

#include"MyWidget.h"

#include<QApplication>

#include<QDebug>

#include<QBuffer>

//#include<QLabel>

//#include<QTextStream>

//#include<QDataStream>

 

/**

 *QFile

 *QBuffer    //memoryfile

 *QTcpSocket

 *QUdpSocket

 *

 *QDataStream

 *QTextStream

 */

 

MyWidget::MyWidget(QWidget*parent):

   QWidget(parent)

{

   QBufferbuffer;

   buffer.open(QIODevice::ReadWrite);

 

   buffer.write("abc");

   buffer.write("aabbcc");

 

   buffer.close();

 

   //可以知道buffer中存储的是缓冲区,通过下面的方式看看buffer中的内容是什么

   qDebug()<<buffer.buffer();

}

 

intmain(intargc,char**argv)

{

   QApplicationapp(argc,argv);

 

   MyWidgetw;

   w.show();

 

   returnapp.exec();

}

运行结果:

 

3 QBuffer QPixmap实现在Label上添加图片,下面是内存文件的应用

#include"MyWidget.h"

#include<QApplication>

#include<QDebug>

#include<QBuffer>

#include<QLabel>

//#include<QTextStream>

//#include<QDataStream>

 

/**

 *QFile

 *QBuffer    //memoryfile

 *QTcpSocket

 *QUdpSocket

 *

 *QDataStream

 *QTextStream

 */

 

MyWidget::MyWidget(QWidget*parent):

   QWidget(parent)

{

   //sendside

QBufferbuffer;

//不要路径,因为它的内容是写在内存里面的。

   buffer.open(QIODevice::ReadWrite);

QPixmappixmap("../aaa.png");

//pixmapsave实际上有两个参数,保存成相应的文件的时候要指定相应的格式,PNG是不是真,JPG是失真的。JPG是有损压缩,PNG是无损压缩。

   pixmap.save(&buffer,"PNG");

   buffer.close();

 

   qDebug()<<buffer.buffer().size();

 

   //recvside

QPixmappixmap2;

//通过loadFromData把它收起来。

   pixmap2.loadFromData(buffer.buffer(),"PNG");

 

   QLabel*label=newQLabel(this);

   label->setPixmap(pixmap2);

}

 

intmain(intargc,char**argv)

{

   QApplicationapp(argc,argv);

 

   MyWidgetw;

   w.show();

 

   returnapp.exec();

}

运行结果:

 

4 QByteArrayQString之间的区别

#include"MyWidget.h"

#include<QApplication>

#include<QDebug>

#include<QBuffer>

#include<QLabel>

//#include<QTextStream>

//#include<QDataStream>

 

/**

 *QFile

 *QBuffer    //memoryfile

 *QTcpSocket

 *QUdpSocket

 *

 *QDataStream

 *QTextStream

 */

 

MyWidget::MyWidget(QWidget*parent):

   QWidget(parent)

{

   //关于QByteArrayQString

   //QByteArray编码的时候将一个汉字编码成3个字节

   QByteArrayba("涂作权");

   //QSting中有自己字符,它的大小就是几个字符

   QStringstr("涂作权");

   qDebug()<<ba.size()<<str.size();

}

 

intmain(intargc,char**argv)

{

   QApplicationapp(argc,argv);

 

   MyWidgetw;

   w.show();

 

   returnapp.exec();

}

 

5 QTextStreamQDataStream的区别

#include"MyWidget.h"

#include<QApplication>

#include<QDebug>

//#include<QBuffer>

#include<QFile>

//#include<QLabel>

#include<QTextStream>

//#include<QDataStream>

 

/**

 *QFile

 *QBuffer    //memoryfile

 *QTcpSocket

 *QUdpSocket

 *

 *QDataStream

 *QTextStream

 */

 

MyWidget::MyWidget(QWidget*parent):

   QWidget(parent)

{

   QFilefile("../teststream.txt");

   //QTextStream需要一个QIODevice来构造它

   file.open(QIODevice::ReadWrite);

 

   QTextStreamtextStream(&file);

 

   //通过下面的方式可以写文件,并且文件内容中是正常的

   textStream<<1<<"abc"<<1.2<<QString("abc");

 

file.close();

//运行之后,在项目所在目录下发现多了teststream.txt文件,文件内容如下:

#if0

   //如果想写进去很方便读出来的话使用DataStream

   QFilefile("../teststream.txt");

   file.open(QIODevice::ReadWrite);

 

   QDataStreamdataStream(&file);

   dataStream<< 1<< "abc"<< 1.2<< QString("abc")<< QPoint(1,1);

file.close();

//上面的运行结果如下:

#endif

}

 

intmain(intargc,char**argv)

{

   QApplicationapp(argc,argv);

 

   MyWidgetw;

   w.show();

 

   returnapp.exec();

}

 

6内存映射,虚拟内存,可以使用多台电脑操作同一个文件(只要指针指向文件的位置不同就可以)

#include "MyWidget.h"
#include <QApplication>
#include <QDebug>
//#include <QBuffer>
#include <QFile>
//#include <QLabel>
#include <QTextStream>
//#include <QDataStream>
 
/**
 * QFile
 * QBuffer     //memory file
 * QTcpSocket
 * QUdpSocket
 *
 * QDataStream
 * QTextStream
 */
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    //虚拟内存和内存映射,QFile可以自动创建文件
    QFile file("../map.txt");
 
    file.open(QIODevice::ReadWrite);
    //扩展文件的大小为64k
    file.seek(64 * 1024);
    //向文件中写入1
    file.write("1");
    //文件关闭
    file.close();
    //然后再通过ReadWrite的方式构造它
    file.open(QIODevice::ReadWrite);
    //构造内存映射
    uchar* ptr = file.map(0,64*1024);
    //可以像指针一样来操作文件内容
    *ptr = ‘a‘;
    ptr[1] = ‘b‘;
 
    //read file
    uchar ch = *ptr;
    file.unmap(ptr);
    file.close();
}
 
int main(int argc,char** argv)
{
    QApplication app(argc,argv);
 
    MyWidget w;
    w.show();
 
    return app.exec();
}
//运行结果:

 

4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(