跳至主要內容

Qt

LincZero大约 3 分钟

Qt

目录

绘图事件 && 画家类

绘画类

QPainter 画家类

  • 头文件

    • #include <QPainter>,画家类
  • 原型声明

    • void paintEvent(QPaintEvent *);,绘画事件

高级设置

  • 使用

    •   void Widget::paintEvent(QPaintEvent)	// 绘图事件,会被自动调用,本来是个空实现
        {
        	QPainter painter(this);
            painter.drawEllipse(QPoint(100,50),50,50);
            painter.setRenderHint(QPainter::Antialiasing);		// 设置画家抗锯齿(其他媒体值查文档)
            painter.drawEllipse(QPoint(200,50),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));
        }
      

QPen 画笔类

QBrush 笔刷类

QPaintEvent 绘画事件类

手动调用绘画事件

  • 注意点

    • 不要直接调用paintEvent(),而用另外的两个函数取间接调用
  • 使用示例(点击按钮移动图片示例)

    •   构造函数{
        	connect(ui->pushButton, &QPushButton::Clicked, [=](){
                posX+=20;	// 每次图片移动20px
        update();	// 而不要直接去调用 paintEvent()
            });
        }
        void Widget::paintEvent(QPaintEvent)
        {
            QPainter painter(this);
        	painter.drawPixmap(posX,100,QPixmap(":/Image/Luffy.png"));
        }
      

综合使用

  • 使用

    •   void Widget::paintEvent(QPaintEvent)	// 绘图事件,会被自动调用,本来是个空实现
        {
            // 初始化画家
            QPainter painter(this);				// 实例化画家对象,this指定绘图的设备
            
            // 设置画笔,并让画家使用画笔(只勾线)
            QPen pen(QColor(255,0,0));							// 设置画笔颜色(也可以使用媒体值指定颜色,如Qt::cyan)
            pen.setWidth(3);									// 设置画笔宽度
            pen.setStyle(Qt::DotLine);							// 设置画笔风格 - 虚线(其他媒体值查文档)
            painter.setPen(pen);								// 让画家使用该画笔
            
            // 设置画刷,并让画家使用画刷(绘制封闭图形时进行填充)
            QBrush brush(QColor(0,255,0));						// 设置画刷颜色(也可以使用媒体值指定颜色,如Qt::cyan)
            brush.setStyle(Qt::Dense7Pattern);					// 设置画刷风格
            painter.setBrush(brush);							// 让画家使用该画刷
            
            // 画家的绘制方法
            painter.drawLine(QPoint(0,0), QPoint(100,100));		// 绘制曲线
            painter.drawEllipse(QPoint(100,100),50,50);			// 绘制椭圆/圆
            painter.drawRect(QRect(20,20,50,50));				// 绘制矩形
            painter.drawText(QRect(10,200,100,50), "Hello");	// 绘制文字
            QImage img;
            img.load(":/Image/Luffy.png");
            painter.drawImage(0,0,img);							// 按图片绘制
            QPicture pic;
            pic.load("E:\\pic.zt");
            painter.drawPicture(0,0,pic);						// 按动作绘制
        }
      

绘图设备类

  • 简概
    • 绘图设备是指继承QPainterDevice的子类
    • 补充:QWidget有两个基类:QObjectQPaintDevice,后者是绘图设备,所以可以在窗口上绘图
  • 分类:Qt一共提供了四个这样的类
    • QPixmap
      • 说明:专门用于在屏幕上显示图像,还做了跨平台显示优化
      • 头文件:#include <QPixmap>
    • QBitmap
      • 继承:是QPixmap的一个子类,它的色深限定为1
      • 说明:可以使用QPixmap的isQBitmap()函数来确定QPixmap是不是一个QBitmap
    • QImage
      • 说明:可以进行图像的像素级访问
    • QPicture
      • 说明:可以记录和重现QPainter的各条命令
    • 补充:gif用的QMoive
      • 头文件:#include <QMovie>

QPixmap 位图类

  • 使用示例(绘制图片并保存)

    •   QPixmap pix(300,300,QImage::Format_RGB32);		// QPixmap绘图设备,300x300大小,RGB32模式(可选参数)
        pix.fill(Qt::white);				// 填充背景色(默认背景透明/为黑)
        QPainter painter(&pix);				// 声明画家(参数为this时表示使用继承了QPainterDevice的主窗口绘画)
        painter.drawEllipse(QPoint(150,150),100,100);	// 回家绘制椭圆
        pix.save("E:\\pix.png");			// 可以画完后保存在本地
      

QImage 图片类

  • 使用示例(利用QImage对像素进行修改)

    •   QPainter painter(this);				// 声明画家
        QImage img;							// QImage绘图设备
        img.load(":/Image/Luffy.png");		// 加载图片
        
        for(int i=50; i<100; i++)
        {
            for(int j=50; j<100; j++)
            {
                QRgb value = qRgb(255,0,0);	// 像素点
                img.setPixel(i,j,value);
            }
        }
        painter.drawImage(0,0,img));		// 画家绘制图片
      

QPicture 绘图指令类

  • 使用示例(记录和重现绘图指令)

    •   // 记录
        QPicture pic;
        QPainter painter;
        painter.begin(&pic);					// 开始画画(绘制在QPicture)
        painter.setPen(QPen(Qt::cyan));
        painter.drawEllipse(QPoint(150,150),100,100);
        painter.end();							// 结束画画
        pic.save("E:\\pic.zt");					// 保存.zt文件
        
        // 重现
        QPainter painter(this);
        QPicture pic;
        pic.load("E:\\pic.zt");					// 加载动作
        painter.drawPicture(0,0,pic);