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,进行操作有点类似,属于普通的轻量级的流操作类。上面图片就是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()