alin的学习之路(Qt篇:四)(QPainter绘图,常用绘图设备,文件I/O)

alin的学习之路(Qt篇:四)(QPainter绘图,常用绘图设备,文件I/O)

1.QPainter绘图

需要重写绘图事件函数void Widget::paintEvent(QPaintEvent *event);

1. 基础绘图

//创建画家
QPainter painter(this);   //this指的是绘画至当前界面

//创建画笔
 QPen pen(QColor(255,0,0));

//设置笔的宽度
pen.setWidth(1);

//设置画笔的样式
pen.setStyle(Qt::CustomDashLine);

//创建画刷
QBrush brush(Qt::cyan);
brush.setStyle(Qt::Dense5Pattern);

//画家拿起画刷
painter.setBrush(brush);

//画家拿起笔
painter.setPen(pen);

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

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

//画矩形
painter.drawRect(50,50,50,50);    //左上角点坐标x,y,宽,高

//画字
painter.setFont(QFont("华文彩云",20));
painter.drawText(QRect(0,200,100,100),"好好学习,天天向上");

2.高级绘图

//创建画家
QPainter painter(this);   //this指的是绘画至当前界面

painter.drawEllipse(QPoint(250,100),50,50);

//抗锯齿效果
painter.setRenderHint(QPainter::Antialiasing);
painter.drawEllipse(QPoint(100,100),50,50);

painter.drawRect(QRect(20,20,50,50));
//移动画家 参数是移动的距离
painter.translate(100,0);
painter.save();  //保存当前状态
painter.drawRect(QRect(20,20,50,50));

painter.translate(100,0);
painter.restore();   //恢复之前的状态
painter.drawRect(QRect(20,20,50,50));


图片按钮向右移动和自动向右移动的实现(移动到窗口最右侧时从左侧出现)

this->posX = 0;
connect(ui->btn_move,&QPushButton::clicked,[=](){
    this->posX += 10;
    update();    //重新执行绘画事件中的代码,意为更新绘图
});

//使用定时器事件类实现图片的自动移动
QTimer *timer = new QTimer(this);
timer->start(10);
connect(timer,&QTimer::timeout,[=](){
    this->posX += 2;
    update();
});

//使用画家画成品图片
QPixmap pix;
pix.load(":/Image/Luffy.png");

//判断图片从右边移出窗口后,使其从左边进来
//this->width()代表当前窗口的宽度
if(posX > this->width())
{
	posX = -pix.width();
}
painter.drawPixmap(this->posX,0,pix);

2.常用绘图设备

QPixmap,QBitmap,QImage,QPicture,QWidget

  1. QPixmap:对不同的平台做了显示的优化

    //QPixmap绘图设备  对不同的平台做了显示的优化
    //创建一个画布
    QPixmap pix(300,300);
    //设置背景色
    pix.fill(Qt::white);
    QPainter painter(&pix);   //指定painter绘画到pix上
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),50,50);
    pix.save("C:/Users/wwww/Desktop/pix.png");    //将画的图保存到指定位置
    
  2. QImage:专门为像素的访问做了优化

    //QImage做绘图设备  专门为像素的访问做了优化
    QImage img(300,300,QImage::Format_RGB32);   //第三个参数是QImage的Format参数,查询帮助即可
    img.fill(Qt::white);
    QPainter painter(&img);
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),50,50);
    img.save("C:/Users/wwww/Desktop/img.png");
    
    //修改像素点
    QPainter painter(this);
    QImage img;
    img.load(":/Image/Luffy.png");
    for(int i=50 ;i<100 ;++i)
    {
    	for(int j = 50 ;j<100 ;++j)
    	{
    		//对像素点进行绘图,使用img.setPixel需要第三个参数是QRgb代表要绘制的内容(颜色等等)
            //QRgb val = qRgb(255,0,0);
            QRgb val = img.pixel(j,i);  //对角线反转
            img.setPixel(i,j,val);
        }
    }
    painter.drawImage(100,0,img);
    
  3. Picture:记录和重现画家的命令

    //QPicture做绘图设备  记录和重现画家的命令
    QPicture pic;
    QPainter painter;
    //开始进行记录:开始需要参数
    painter.begin(&pic);
    painter.setPen(QPen(Qt::red));
    painter.drawEllipse(QPoint(150,150),50,50);
    //结束记录:结束不需要参数
    painter.end();
    
    pic.save("C:/Users/wwww/Desktop/pic.wxl");   //文件名和后缀可自行随意指定
    
    
    //解析QPicture文件,重现画家操作
    QPicture pic;
    pic.load("C:/Users/wwww/Desktop/pic.wxl");
    painter.drawPicture(100,0,pic);
    

3.文件IO

1.读文件

添加一个按钮,点击按钮弹出文件选择对话框,选择文件后在lineEdit中显示绝对路径,在textEidt中显示文件中的文章

QString filePath = QFileDialog::getOpenFileName(this,"选择文件","C:\\Users\\wwww\\Desktop","(*.txt)");
if(filePath.isEmpty())
{
    QMessageBox::warning(this,"警告","文件路径不能为空");
}
else
{
    ui->lineEdit->setText(filePath);

    //读文件
    QFile file(filePath);

    //设置codec为gbk模式,用于读gbk编码模式的文件
    QTextCodec* codec = QTextCodec::codecForName("gbk");

    //打开文件
    file.open(QIODevice::ReadOnly);

    //从文件中读数据
    QByteArray arr;
    //方法1:一次性读全部内容,返回的是QByteArray类型
    //arr = file.readAll();

    //方法2:一次读一行
    while(!file.atEnd())
    {
        arr += file.readLine();
    }

    //默认读的模式是utf-8的
    ui->textEdit->setText(arr);

    //读gbk模式的
    //ui->textEdit->setText(codec->toUnicode(arr));

    //关闭文件
    file.close();

2.写文件

//写文件
file.open(QIODevice::Append);
file.write("啊啊啊啊啊啊啊啊");
file.close();

3.获取文件信息

QFileInfo info(filePath);
qDebug() << "文件名:" << info.fileName().toUtf8().data() << "后缀名:" << info.suffix() << "文件路径:" << info.filePath() << "文件大小:" << info.size();
qDebug() << "创建日期:" << info.created().toString("yyyy/mm/dd hh:mm:ss")
		<< "最后的修改日期" << info.lastModified().toString("yyyy/mm/dd hh:mm:ss") ;
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值