QT基础知识-画图和文件(第三天)

1,如果在窗口绘图,必须放在绘图时间里实现。窗口需要重新绘图的时候,绘图事件内部自动调用。

     创建画家对象语法:QPainter p(Device *);

     使用对象p来调用各种画图的方法。

     QT画图代码如下:

void Widget::paintEvent(QPaintEvent *){
    QPainter p(this);
    //绘图操作 p.drawxxx();
    //画背景图
    p.drawPixmap(0, 0, this->width(), this->height(), QPixmap("../123.jpg"));

    //定义画笔
    QPen pen;
    pen.setWidth(5);//设置线宽
    pen.setColor(Qt::red);//也可以使用RGB进行设置,QColor(14, 15, 16)
    pen.setStyle(Qt::DashLine);//设置风格

    //把画笔交给画家
    p.setPen(pen);

    //创建画刷对象,用于填充封闭区域
    QBrush brush;
    brush.setColor(Qt::blue);
    brush.setStyle(Qt::Dense1Pattern);//设计样式

    p.setBrush(brush);

    //画直线 drawRect()画矩形
    p.drawLine(50, 50, 150, 50);//前面两个是起点坐标,后面两参数是终点坐标
    p.drawLine(50, 50, 50, 150);

    p.drawRect(150, 150, 100, 50);
}

2,1 中的代码是自动刷新的,如果需要手动更新窗口,需要调用update(),一调用update()函数就会调用画图事件函数。

3,QPixmap和QBitmap

     QBitmap是继承于QPixmap。QBitmap这有两种颜色,黑白;QPixmap可以有彩色图片。

4,绘图设备

     常用的有三种QPixmap,QImage,QPicture,它们都是要在窗口上绘图的,三种绘图的语法一模一样,区别如下。

     QPixmap:针对屏幕进行优化了,但是和平台相关,最常用。

     QImage:和平台无关,可以对图片进行修改,即对图片中的像素点进行操作setPixel(),在线程中绘图。

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

     使用语法如下:

      QPixmap pixmap(400, 300);

      QPainter p(&pixmap);//定义画家,并设置绘图设备

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

      pixmap.save("../pixmap.png");//把画好的图保存,不在窗口上绘图

      QPixmap可以和QImage相互转化,QImage tempImage = pixmap.toImage();pimap是QPixmap的对象;

              QPixmap tempPixmap = QPixmap::fromImage(image);//QImage转成QPixmap

5,不规则窗口

     使用setWindowFlags(Qt::FramelessWindowHint | windowFlags())去掉边框。以及设计不规则窗口的移动与关闭。

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //去窗口边框,经过这两步会把关闭的地方取消,也不能移动,需要重写鼠标事件
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

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

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

void Widget::paintEvent(QPaintEvent *e)
{
    QPainter p(this);
    p.drawPixmap(0, 0, QPixmap("../123.jpg"));

}

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

void Widget::mouseMoveEvent(QMouseEvent *e)
{
    if(e -> buttons() & Qt::LeftButton){
        move(e ->globalPos() - p);
    }
}

6,Qt中的IO结构

   箭头表示的是继承关系,有箭头的一方是父类,没有箭头的一方是子类。

读文件伪代码如下:

QString path = QFileDialog::getOpenFileName(父对象指针, 操作, 路径, 文件格式)

QFile file(path);//文件对象

bool isOk = file.open(打开方式);//打开文件,返回值来判断打开是否成功

if(isOk == true){

      QByteArray array = file.readAll();//读文件,默认识别的是utf8的编码

      ui -> textEdit -> setText(QString(array));//显示到编辑区

}

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

写文件伪码如下:
 

QString path = QFileDialog path = QFileDialog::getSaveFileName(父对象指针, 操作类型,文件路径, 文件格式)

if(path.isEmpty() == false){

     QFile file; //创建文件对象

     file.setFileName(path);//关联文件名字

     //打开文件,只写方式

     bool isOk = file.open(QIODevice::WriteOnly);

     if(isOk == true){

          QString str = ui -> textEdit -> toPlainText();//获取编辑区内容

          file.write(str.toUtf8());//写文件,QString -> QByteArray()

    }

    file.close();   

}

注意toUtf8是转成中文编码,toLocal8Bit是转成本地编码

使用类QFileInfo就可以获取文件信息,包括文件名字,文件后缀,文件大小,文件创建时间等。

使用类QDataStream就可以使用二进制流的方式来操作,保存的方式也是二进制文件,看不懂没关系,只要计算机可以看懂就可  以,可以取出来让自己算看懂就可以。QDataStream stream(&file);//创建数据流,和file文件关联;往数据流中写数据,相当于往文件里写数据。

使用类QTextStream就可以使用文本的方式操作,QTextStream stream(&file);//创建文本流,和file文件关联;往文本流中写数据,相当于往文件里写数据。最好让读写所设置的编码一样。

使用类QBuffer就可以内存的方式操作,QBuffer memFile;//创建内存文件,这是写到缓冲区里面。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值