QT:笔记1,文件存储格式,QMainwindow中的布局错误

1,我在继承QMainWindow的子类中去布局,出现错误,虽然工程能运行起来,但是并没有相应的显示效果。
当使用qt布局时候出现错误 QLayout: Attempting to add QLayout "" to MainWindow "", which already has a layout.  的时候,处理方法如下:
QWidget *widget = new QWidget();//新添加的内容   创建一个QWidget实例    
this->setCentralWidget(widget);//新添加的内容      将创建的实例设置为centralWidget:

//下面实例是在窗口上有2个按钮,点不同的按钮就有不同的流去写文件

#include "mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)
{
    QWidget *wdgt=new QWidget();//这里创建widget是为了在widget中布局,再把widget放到mainwindow上,否则是不能布局的
    this->setCentralWidget(wdgt);//设置widget在mainwindow中的位置
    QPushButton *btn=new QPushButton();
    btn->setText(tr("QTextStream"));
    QPushButton *btn1=new QPushButton();
    btn1->setText(tr("QDataStream"));
    QGridLayout *lay=new QGridLayout(wdgt);
    lay->addWidget(btn);
    lay->addWidget(btn1);
    connect(btn,SIGNAL(clicked()),this,SLOT(QTextStreamDeal()));
    connect(btn1,SIGNAL(clicked()),this,SLOT(QDataStreamDeal()));
}
MainWindow::~MainWindow(){}
void MainWindow::QTextStreamDeal()
{
    QFile data("D:\\Qtworkspace\\FileTest\\textstream.dat");
    if(data.open(QFile::WriteOnly|QFile::Truncate)) {
        QTextStream out(&data);
//        out<
        out<<"wel:"<<90<
    }
}
void MainWindow::QDataStreamDeal()
{
    fileFun();
}
void MainWindow::fileFun()
{//QDataStream功能强大
    QByteArray *barray=new QByteArray();//注意以qbytearray的形式写到文件中的二进制字符串(包括Qstring)是正常的,没有添加多余项
    QFile file("D:\\Qtworkspace\\FileTest\\datestream.dat");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate);
    QDataStream out(&file);   //将数据序列化
    barray->append((quint8)10);//写到文件中是二进制 0x0a
    barray->append("10");//0x31 0x30
    barray->append("wel:");//0x77 0x65 0x6c
    barray->append((quint32)10);//0x0a 这个位置并不是 0x00 0x00 0x00 0x0a,如果想必须占用4个字节就要用下面的数组的形式
    unsigned char testarray[20]={10,'1','0','w','e','l',0,0,0,10};

// int a = 10; testarray[10]=((a>>24)&0xff); testarray[11]=((a>>16)&0xff);....

//    int len=out.writeRawData(barray->constData(),barray->count());//barray->size()
    int len=out.writeRawData((const char*)testarray,sizeof(testarray));
   qDebug()<<"writelen:"< 
  
    file.close();
 
    char readbuf[1024]={0};
    int readlen=0;
 
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    readlen =  in.readRawData(readbuf,30);
    file.close();
    qDebug()<<"readlen:"< 
  
    QString str;
    QString str1;
    for(int i=0;i 
  
    {
        str.sprintf("%02x ",readbuf[i]);//qDebug("%02x ",readbuf[i]);
        str1.append(str);
    }
    qDebug()< 
  
#if 0

//以QDataStream中重载<<的方式写二进制数据到文件中的字符串就会添加一些东西,char * 的会在前面添加一个4字节的长度指示,QString类型的会在前面4字节的长度,每个字符后面添加0

    out <<(qint8)10;//整数序列化
    out <
//    out << QDate::fromString("1994/09/25", "yyyy/MM/dd");
    out << (qint32)19;
     out << "wel";
     out << *barray;
    file.close();//qint8 QString(wel) qint32
 
    file.setFileName("D:\\Qtworkspace\\FileTest\\datestream.dat");
    if(!file.open(QIODevice::ReadOnly))
    {
         qDebug()<< "error!";
         return;
    }
    QDataStream in(&file);                            	//从文件中读出数据
    QString name;
    quint8 i;
    QDate birthday;
    qint32 age;
 
    in >> i >> name >> age; 	//获取字符串和整数 //qint8 QString(wel) qint32
//    qDebug() << i << birthday << age;
    qDebug() << i << name << age;
    file.close();
#endif
}
 

QTextStream和QDataStream都是面向数据流的,都适用于QIODevice,但是他们的侧重点不同。可以这么说,QTextStream能做的事情QDataStream都能做。
QTextStream 侧重于向QIODevice文本读写,这里所说的文本指的是普通的简单的QChar,QString,QLatin1Char,int等等之内的,和C语言中写文件或者网络传输的时候,先将内容填充到一个buffer,进行操作有点类似,属于普通的轻量级的流操作类。

QT:笔记1,文件存储格式,QMainwindow中的布局错误_第1张图片

上面图片就是QDataStream 以out<<的形式输出(qint8)10 QString("wel") (qint32)19

 

 

上面图片就是QDataStream 以QByteArray的形式输出(qint8)10  "10" QString("wel:") (qint32)10 "wel:"

 

 

上面图片就是QDataStream 以unsigned char 数组的形式输出(char)10  "10" "wel")  (int)10 

 

所以推荐用QDataStream

顺便提一句在调试输出时用qDebug()而不是QDebug()

 

 

 

 

你可能感兴趣的:(QT)