QT_C++07-QPainter绘图,QFile文件读写,文本流和数据流

01 项目创建

详见

02 QPainter基本绘图

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void paintEvent(QPaintEvent *event);

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

widget.cpp:

#include "widget.h"
#include "ui_widget.h"

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

void Widget::paintEvent(QPaintEvent *event)
{
    //创建画家
    QPainter painter(this);

    //设置画笔颜色
    QPen pen(QColor(255,0,0));
    //设置笔宽度
    pen.setWidth(3);
    //设置笔风格
    pen.setStyle(Qt::DotLine);
    //画家要用这只笔
    painter.setPen(pen);

    //画刷填充颜色
    QBrush brush(Qt::cyan);
    //让画家使用画刷
    brush.setStyle(Qt::Dense4Pattern);
    painter.setBrush(brush);

    //利用画家画画
    //画线
    painter.drawLine(QPoint(0,0),QPoint(100,100));

    //画圆(椭圆)
    painter.drawEllipse(QPoint(100,100),50,50);

    //画矩形
    painter.drawRect(QRect(10,10,50,50));

    //画字体
    painter.drawText(QRect(10,200,150,50),"好好学习,天天向上!");
}

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

main.cpp:

#include "widget.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

QT_C++07-QPainter绘图,QFile文件读写,文本流和数据流_第1张图片

03 绘图高级设置

1.抗锯齿

 //创建画家
    QPainter painter(this);

    //高级设置
    painter.drawEllipse(QPoint(100,100),50,50);
    //设置抗锯齿,效率低
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,100),50,50);

QT_C++07-QPainter绘图,QFile文件读写,文本流和数据流_第2张图片

2.画家移动

widget.cpp:

#include "widget.h"
#include "ui_widget.h"

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

void Widget::paintEvent(QPaintEvent *event)
{
    //创建画家
    QPainter painter(this);

    //高级设置
//    painter.drawEllipse(QPoint(100,100),50,50);
//    //设置抗锯齿,效率低
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(200,100),50,50);

    painter.drawRect(QRect(20,20,50,50));

    //移动画家
    painter.translate(QPoint(100,0));

    //保存状态
    painter.save();

    painter.drawRect(QRect(20,20,50,50));

    painter.translate(QPoint(100,0));

    //取出状态
    painter.restore();
    painter.drawRect(QRect(20,20,50,50));


//    //设置画笔颜色
//    QPen pen(QColor(255,0,0));
//    //设置笔宽度
//    pen.setWidth(3);
//    //设置笔风格
//    pen.setStyle(Qt::DotLine);
//    //画家要用这只笔
//    painter.setPen(pen);

//    //画刷填充颜色
//    QBrush brush(Qt::cyan);
//    //让画家使用画刷
//    brush.setStyle(Qt::Dense4Pattern);
//    painter.setBrush(brush);

//    //利用画家画画
//    //画线
//    painter.drawLine(QPoint(0,0),QPoint(100,100));

//    //画圆(椭圆)
//    painter.drawEllipse(QPoint(100,100),50,50);

//    //画矩形
//    painter.drawRect(QRect(10,10,50,50));

//    //画字体
//    painter.drawText(QRect(10,200,150,50),"好好学习,天天向上!");
}

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

QT_C++07-QPainter绘图,QFile文件读写,文本流和数据流_第3张图片

04 手动调用绘图事件

首先为项目添加资源文件qrc

widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void paintEvent(QPaintEvent *event);

    //声明初始位置坐标
    int posX=0;


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

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include"QPushButton"

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

    //点击移动按钮,移动图片

    posX=10;
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX+=10;
        //手动调用绘图事件
        update();
    });

}

void Widget::paintEvent(QPaintEvent *event)
{
    //创建画家
    QPainter painter(this);

    //画图片
    painter.drawPixmap(posX,10,QPixmap(":/images/1.jpg"));

    //如果出屏幕,强制变回10
    if(posX>this->width())
    {
        posX=10;
    }

    //高级设置
//    painter.drawEllipse(QPoint(100,100),50,50);
//    //设置抗锯齿,效率低
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(200,100),50,50);

//    painter.drawRect(QRect(20,20,50,50));

//    //移动画家
//    painter.translate(QPoint(100,0));

//    //保存状态
//    painter.save();

//    painter.drawRect(QRect(20,20,50,50));

//    painter.translate(QPoint(100,0));

//    //取出状态
//    painter.restore();
//    painter.drawRect(QRect(20,20,50,50));


//    //设置画笔颜色
//    QPen pen(QColor(255,0,0));
//    //设置笔宽度
//    pen.setWidth(3);
//    //设置笔风格
//    pen.setStyle(Qt::DotLine);
//    //画家要用这只笔
//    painter.setPen(pen);

//    //画刷填充颜色
//    QBrush brush(Qt::cyan);
//    //让画家使用画刷
//    brush.setStyle(Qt::Dense4Pattern);
//    painter.setBrush(brush);

//    //利用画家画画
//    //画线
//    painter.drawLine(QPoint(0,0),QPoint(100,100));

//    //画圆(椭圆)
//    painter.drawEllipse(QPoint(100,100),50,50);

//    //画矩形
//    painter.drawRect(QRect(10,10,50,50));

//    //画字体
//    painter.drawText(QRect(10,200,150,50),"好好学习,天天向上!");
}

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

main.cpp:

#include "widget.h"

#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

QT_C++07-QPainter绘图,QFile文件读写,文本流和数据流_第4张图片

05 绘图设备

1.概述

绘图设备是继承自QPaintDevice类的子类,QT一共提供了四个绘图设备类:
(1)QPixmap专门为图像在不同屏幕(平台)上的显示做了优化
(2)QBitmap是QPixmap的一个子类,它的色深限制为1,可以使用QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap
(3)QImage专门为图像的像素级访问做出优化
(4)QPicture则可以记录和重现QPainter的各条命令,保存的图像格式为任意(自定义)格式

2.项目创建

详见

3.QPixmap绘图设备

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    /*################QPixmap绘图设备:专门为平台做了显示优化###############*/
    //(1)QPixmap绘图设备
    //#include 
    QPixmap pix(300,300);
    pix.fill(Qt::white);

    //(2)声明画家
    //#include 
    QPainter painter(&pix);//绘图设备和画笔绑定

    //(3)绘制
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),100,100);

    //(4)保存
    pix.save("D:\\pixmap.png");

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

4.QImage绘图设备-绘图

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    /*################QImage绘图设备:可以对像素进行操作###############*/
    //(2)QImage绘图设备
    //#include 
    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);

    //(2)声明画家
    //#include 
    QPainter painter(&img);//绘图设备和画笔绑定

    //(3)绘制
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);

    //(4)保存
    img.save("D:\\img.png");


}

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

5.QImage绘图设备-像素级操作

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    /*################QImage绘图设备:可以对像素进行操作###############*/
    //(2)QImage绘图设备
    //#include 
   QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);

    //(2)声明画家
    //#include 
    QPainter painter(&img);//绘图设备和画笔绑定

    //(3)绘制
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);

    //(4)保存
    img.save("D:\\img.png");


}
//重写绘图事件
void Widget:: paintEvent(QPaintEvent *ev)
{
    //利用QImage对像素进行修改
    //(1)创建设备
    QImage img;
    img.load(":/image/1.png");
    //(2)创建画笔
    QPainter painter(this);
    //(3)修改像素点
    for(int i=50;i<100;i++)
    {
        for (int j=50;j<100;j++)
        {
            QRgb value=qRgb(0,255,0);
            img.setPixel(i,j,value);
        }
    }
    //(4)绘图
    painter.drawImage(0,0,img);

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

6.QPicture绘图设备-绘图

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    /*################QPicture绘图设备:可以记录和重新绘图指令###############*/
    //(1)QPicture绘图设备
    //#include 
    QPicture pic;

    //(2)声明画家
    //#include 
    QPainter painter(&pic);//绘图设备和画笔绑定

    //(3)开始绘制
    painter.begin(&pic);//开始在pic设备上绘画

    painter.setPen(QPen(Qt::red));
    painter.drawEllipse(QPoint(150,150),100,100);

    //(4)结束绘制
    painter.end();

    //(5)保存
    pic.save("D:\\pic.zt");
}

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

7.QPicture绘图设备-重现绘图指令

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 

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

    /*################QPicture绘图设备:可以记录和重现绘图指令###############*/
    //(1)QPicture绘图设备
    //#include 
    QPicture pic;

    //(2)声明画家
    //#include 
    QPainter painter(&pic);//绘图设备和画笔绑定

    //(3)开始绘制
    painter.begin(&pic);//开始在pic设备上绘画

    painter.setPen(QPen(Qt::red));
    painter.drawEllipse(QPoint(150,150),100,100);

    //(4)结束绘制
    painter.end();

    //(5)保存
    pic.save("D:\\pic.zt");
}

void Widget:: paintEvent(QPaintEvent *ev)
{

    //(1)重现QPicture绘图指令
   QPicture pic;
   pic.load("D:\\pic.zt");
    //(2)创建画笔
    QPainter painter(this);

    //(3)绘图
    painter.drawPicture(0,0,pic);

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

06 QFile文件读写操作

1.项目创建

详见

2.代码实现

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include"QFileDialog"
#include"QMessageBox"
#include"QFile"
#include"QTextCodec"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //点击按钮,选取文件
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\13446\\Desktop");
        if(path.isEmpty()){
            QMessageBox::warning(this,"警告","打开失败");
        }
        else
        {
            //将路径放入lineEdit
            ui->lineEdit->setText(path);
            //读取文件 QFile默认支持UTF-8格式

            //设置 gbk格式
            //QTextCodec * codec = QTextCodec::codecForName("gbk");

            QFile file(path);//参数路径名称
            //指定打开方式(只读)
            //file.open(QIODevice::ReadOnly);
            file.open(QFileDevice::ReadOnly);

            QByteArray array;

            //一次性读
            array = file.readAll();

            //一行行读
//            while(!file.atEnd())
//            {
//                array+=file.readLine();
//            }

            //设置到文本编框中
            ui->textEdit->setText(array);

            //读gbk
            //ui->textEdit->setText(codec->toUnicode(array));
            file.close();

            //写文件
            //重新指定打开方式
            file.open(QFileDevice::Append);//追加模式
            file.write("aaaaaaa");
            file.close();
        }
    });
}

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

QT_C++07-QPainter绘图,QFile文件读写,文本流和数据流_第5张图片

07 文件信息

 //***************QFileInfo文件信息类#####################//
 QFileInfo info(path);
 qDebug()<<"文件大小:"<
qDebug()<<"创建日期:"<

在这里插入图片描述

08 文本流和数据流

//文件流读写文件
//分类:文本流(基础数据类型) 和 数据流(大型QImage)

//文本流
QFile file("aaa.txt");
file.open(QFileDevice::WriteOnly);
QTextStream stream(&file);
stream<>str;//读取空格,结束
str = stream.readAll();
qDebug()<>str>>num; //以块的方式读取
qDebug()<

你可能感兴趣的:(#,Qt,qt,c++)