Qt学习记录(十二)绘图设备,QFile

目录

前言:

一,绘图设备

QPixmap

QImage

QPicture

QPixmap->QIamge转换

不规则窗口

二,QFile

QFile读文件 

QFile写文件

QFile获取文件信息

 QDataStream读写文件

QTextStream操作文件

QBuffer操作文件


前言:

咪咪哭唧唧

一,绘图设备

QPixmap:针对屏幕进行优化了,和平台相关,不能对图片进行修改

QImage:和平台无关,可以对图片进行修改,在线程中绘图

QPicture:保存绘图的状态(二进制文件)

三者用法一样

QPixmap

    ui->setupUi(this);

    //绘图设备 400*300
    QPixmap pixmap(400,300);

    QPainter p(&pixmap);
    //填充白色背景色
    p.fillRect(0,0,400,300,QBrush(Qt::white));

    p.drawPixmap(0,0,QPixmap("../Image/meme_kuku.jpg"));

    //保存图片
    pixmap.save("../pixmap.png");

QImage

     ui->setupUi(this);
    //创建一个绘图设备,QImage::Format_ARGB32背景是透明
    QImage image(500,500,QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);

    //绘图
    p.drawImage(0,0,QImage("../Image/meme_think3.png"));

    //绘图设备前50个像素点进行操作
    for(int i = 0;i<50;i++)
    {
        for(int j = 0;j<50;j++)
        {
            image.setPixel(QPoint (i,j),qRgb(0,255,0));
            image.pixel(QPoint(i,j));
        }
    }
    p.end();
    image.save("../image.png");

QPicture

//widget.h
protected:
    void paintEvent(QPaintEvent *);



/widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPicture picture;
    QPainter p;
    p.begin(&picture);

    p.drawPixmap(0,0,80,80,QPixmap("../Image/meme_kuku.jpg"));
    p.drawLine(50,50,150,150);

    p.end();
    //保存的是二进制文件
    picture.save("../picture.png");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *)
{
    QPicture pic;
    pic.load("../picture.png");//加载文件

    QPainter p(this);
    p.drawPicture(0,0,pic);

}

QPixmap->QIamge转换

    QPainter p(this);
    QPixmap pixmap;
    pixmap.load("../Image/meme_kuku");
    
    //QPixmap->QIamge
    QImage tempImage= pixmap.toImage();
    p.drawImage(0,0,tempImage);
    
    QImage image;
    image.load("../Image/meme_kuku");
    
    QPixmap tempPixmap = QPixmap::fromImage(image);
    p.drawPixmap(100,0,tempPixmap);

不规则窗口

///widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void paintEvent(QPaintEvent *);

    void mouseMoveEvent(QMouseEvent *e)override;
    void mousePressEvent(QMouseEvent *e)override;

private:
    Ui::Widget *ui;
    QPoint p ;
};
#endif // WIDGET_H


//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //去窗口边框
    //获取当前窗口的窗口标志
    QFlags<Qt::WindowType> flags = Qt::FramelessWindowHint;
    //添加 windowFlags 标志
    flags |= windowFlags();
    //设置新的窗口标志
    setWindowFlags(flags);
//  setWindowFlag ( Qt::FramelessWindowHint | windowFlags() );
    //setWindowFlag() 函数期望一个单个的 Qt::WindowType 值,而不是一个 QFlags
    //Qt::FramelessWindowHint 是一个独立的 Qt::WindowType 值

    //把窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);

}

Widget::~Widget()
{
    delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.drawPixmap(0,0,QPixmap("../Image/meme_think3.png"));

}

void Widget::mousePressEvent(QMouseEvent *e )
{
    if( e -> button() ==Qt::RightButton)
    {
        //如果是右键
        close();
    }
    else if (e -> button()==Qt::LeftButton)
    {
        //求坐标差值
        //当前点击坐标-窗口左上角坐标
        p = e -> globalPos() - this -> frameGeometry().topLeft();
    }
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    move(e->globalPos() - p);
}

二,QFile

QFile读文件 

//读文件
void Widget::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
    if (path.isEmpty() == false)
    {
        //文件对象
        QFile file(path);

        //打开文件,只读方式
        bool isOK = file.open(QIODevice::ReadOnly);
        if(isOK == true)
        {
# if 0
            //读文件,默认只识别UTF-8编码,
            QByteArray array =  file.readAll();
            //显示到编辑区
            //ui->textEdit->setText(QString(array));
            ui->textEdit->setText(array);//等同
#endif

            QByteArray array;
            while(file.atEnd()==false)
            {
                //读一行
                array += file.readLine();
            }
            ui->textEdit->setText(array);
        }
        //关闭文件
        file.close();
    }
}

 

QFile写文件

//保存文件
void Widget::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
    if(path.isEmpty() == false)
    {
        QFile file;//创建文件对象
        //关联文件名字
        file.setFileName(path);

        //打开文件,只写方式
        bool isOK = file.open(QIODevice::WriteOnly);
        if(isOK == true)
        {
            //获取编辑区内容
            QString str = ui->textEdit->toPlainText();
            //写文件
            //QString -> QByteArray
            //file.write(str.toUtf8());

            //QString -> string -> char*
            file.write(str.toStdString().data());

            //转换本地平台编码
            file.write(str.toLocal8Bit());

            //QString -> QByteArray
            QString buf = "123";
            QByteArray a = buf.toUtf8();    //中文
            a = buf.toLocal8Bit();          //本地编码

            //QByteA -> char *
            char *b = a.data();

            //char * -> QString
            char *p = "abc";
            QString c = QString(p);
        }
        file.close();
    }
}

 

QFile获取文件信息

    //获取文件信息
        QFileInfo info(path);
        qDebug() << "文件名字:" << info.fileName().toUtf8().data();
        qDebug() << "文件后缀:" << info.suffix();
        qDebug() << "文件大小:" << info.size();
        qDebug() << "文件创建时间:" << info.created().toString("yyyy-MM-dd hh:mm:ss");//2024-01-04 15:47:00

 

 QDataStream读写文件

通过二进制的方式操作文件

写文件

///widget.h/
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void writeData();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
///widget.cpp/
#include "widget.h"
#include "ui_widget.h"
#include <QDataStream>
#include <QFile>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    writeData();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::writeData()
{
    //创建文件对象
    QFile file("../test.txt");

    //打开文件,只写方式打开
    bool isOK = file.open(QIODevice::WriteOnly);
    if(true == isOK)
    {
        //创建数据流,和file文件关联
        //往数据流中输入数据,相当于往文件里写数据
        QDataStream stream(&file);

        stream << QString ("打开文件,只写方式打开") <<250;
        file.close();
    }
}

此时还是乱码,无法读取

 读文件

记得在.h声明函数
//.cpp//
//
#define cout qDebug() << "[" << __FILE__ << ";" << __LINE__ << "]"
//
void Widget::readData()
{
    //创建文件对象
    QFile file("../test.txt");

    //打开文件,只读方式打开
    bool isOK = file.open(QIODevice::ReadOnly);
    if(true == isOK)
    {
        //创建数据流,和file文件关联
        //往数据流中输入数据,相当于往文件里写数据
        QDataStream stream(&file);
        //读的时候,按写的顺序取数据
        QString str;
        int a;
        stream >>str >> a;
        //qDebug() << str.toUtf8().data() << a;
        cout << str.toUtf8().data() << a;

        file.close();

    }

}

 #define cout qDebug() << "[" << __FILE__ << ";" << __LINE__ << "]"

QTextStream操作文件

写文件

void Widget::writeData()
{
    QFile file;
    file.setFileName("../demo.txt");
    bool isOK = file.open(QIODevice::WriteOnly);
    if(true == isOK)
    {
        QTextStream stream(&file);
        stream << QString ("创建数据流,和file文件关联") << 250;
        file.close();
    }
}

//指定编码
        stream.setCodec("UTF-8");

 读文件

错误读文件方式

.h声明 .cpp调用

void Widget::readData()
{
    QFile file;
    file.setFileName("../demo.txt");
    bool isOK = file.open(QIODevice::ReadOnly);
    if(true == isOK)
    {
        QTextStream stream(&file);
        //指定编码,什么编码写就什么编码读
        stream.setCodec("UTF-8");
        QString str;
        int a ;
        stream >> str >> a;
        cout << str.toUtf8().data() <<a;
        file.close();
    }
}

不推荐

推荐方法 

void Widget::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open","../");
    if(false == path.isEmpty())
    {
        QFile file;
        file.setFileName(path);

        bool isOK = file.open(QIODevice::ReadOnly);
        if(true == isOK)
        {
            QTextStream stream(&file);
            //指定编码,什么编码写就什么编码读
            stream.setCodec("UTF-8");

            QString str = stream.readAll();
            ui-> textEdit ->setText(str);
        }
    }
}

QBuffer操作文件

#include "widget.h"
#include "ui_widget.h"
#include <QBuffer>//内存文件
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QBuffer memFile;//创建内存文件
    memFile.open(QIODevice::WriteOnly);

    memFile.write("111111111111");
    memFile.write("22222222222222222222");

    memFile.close();

    qDebug() << memFile.buffer();
}

Widget::~Widget()
{
    delete ui;
}

    QByteArray array;
    QBuffer memFile(&array);//创建内存文件

    memFile.open(QIODevice::WriteOnly);
    memFile.write("111111111111");
    memFile.write("222222222222");
    memFile.close();

    qDebug() << memFile.buffer();
    qDebug() << "array" << array;

    QByteArray array;
    QBuffer memFile(&array);//创建内存文件

    memFile.open(QIODevice::WriteOnly);
    memFile.write("111111111111");
    memFile.write("222222222222");
    memFile.close();

    qDebug() << memFile.buffer();
    qDebug() << "array" << array;

    QBuffer memFile1;
    memFile1.open(QIODevice::WriteOnly);
    QDataStream stream(&memFile1);
    stream << QString("测试") <<250;
    memFile1.close();

    qDebug() <<memFile1.buffer();

    memFile1.open(QIODevice::ReadOnly);
    QDataStream in;
    in.setDevice(&memFile1);
    QString str;
    int a;
    in >> str >> a;
    memFile1.close();

    qDebug() << str.toUtf8().data() << a;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值