Qt 之2D绘图学习笔记---------之第一天

2 篇文章 0 订阅

注: 仅供本人学习参考。

Qt 2D绘图所用到的函数:

头文件:#include <QPainter>
void paintEvent(QPaintEvent *);//所有的图形绘制都必须放在此函数里面。

paintEvent函数是进行重绘的函数,只要出现如下几种情况,系统就会产生屏幕重绘事件,  从而自动调用paintEvent函数:
(1)当窗口部件第一次显示时。
(2)重新调整窗口部件大小,或者窗口从隐藏到显示。
(3)当窗口部件被其他部件遮挡,然后又再次显示出来时,就会对隐藏的区域产生一个重绘。
事件。

程序员如果想调用这个函数,只能通过repaint()函数或者update()函数,而且这两个函数都是对整个屏幕进行重绘,如果只想重绘屏幕的一部分,调用上述两个函数时就需要把参数带上,比如repaint(x,y,w,h)就是重绘屏幕上以(x,y)为左上角定点,宽为w,高为h的矩形区域。
总结一下,使用Qt进行2D绘图的问题就在于,不能随时随地调用绘画的函数,而且进行绘画的命令不是我一个人说了算,系统的优先级要高于我。

解决方案如下:
设置一个全局变量tag标记,paintEvent函数内用if-else语句根据这个tag的值不同而执行不同的语句,tag=-1对应的执行语句为空,只要tag=-1,不管系统怎么调用这个函数都没用,只是会清屏罢了,这个避免不了,因为系统调用这个函数的时候可没有设置重绘的范围,是全部都重绘的,如果没用重绘的具体语句,就相当于清屏了。
原文链接:https://blog.csdn.net/sinat_41909065/article/details/83246957

  . 绘制图像基础

Qt提供了4个类来处理图像:QImage、QPixmap、QBitmap、QPicture,为了对这几个类加以区分,分别称QImage为图像、QPixmap为像素图、QBitmap为位图、QPicture为图片,这些类的区别及作用如下
①、QImage类提供了一个与硬件无关的图像表示方法,可以直接访问和操控像素,也就是说该类可修改或编辑图像的像素。该类还可以用于进行I/O处理,并对I/O处理操作进行了优化
②、QPixmap类主要用于在屏幕上显示图像,QPixmap中的像素数据是由底层窗口系统进行管理的,该类不能直接访问和操控像素,只能通过QPainter的相应函数或把QPixmap转换为QImage来访问和操控像素。QPixmap可通过标签(QLabel类)或QAbstractButton的子类(icon属性)显示在屏幕上。
③、QBitmap是QPixmap的子类,用于处理颜色深度为1的图像,即只能显示黑白两种颜色。
④、QPicture用来记录并重演QPainter命令,QPicture与分辨率无关,可在不同设备上显示。该类使用一个与平台无关的格式(.pic格式)把绘图命令序列化到I/O设备,所有可绘制在QWidget部件或QPixmap上的内容都可以保存在QPicture中,该类的主要作用是把一个绘制设备上使用QPainter绘制的所有图形保存在QPicture之中,然后再把这些图形重新绘制在其他绘图设备上。
通常,可以使用QImage类来加载并操作图像数据,然后把QImage对象转换为QPixmap再显示到屏幕上,若不需对图像进行操作,也可直接使用QPixmap来加载并显示图像。
QImage、QPixmap、QBitmap、QPicture都是QPaintDevice类的子类(直接或间接),因此他们都是绘制设备,可以直接在其上进行图形绘制。
更多基础内容可以转至大佬原文链接:https://blog.csdn.net/hyongilfmmm/article/details/83233589

dialog.h:

#ifndef DIALOGIO_H
#define DIALOGIO_H

#include <QDialog>
#include <QPainter>

namespace Ui {
class DialogIO;
}

class DialogIO : public QDialog
{
    Q_OBJECT

public:
    explicit DialogIO(QWidget *parent = 0);
    ~DialogIO();

    void paintEvent(QPaintEvent *event);
private:
    Ui::DialogIO *ui;

    int tag = -1;//标志
    double x,y;//坐标
    double h,l;//长宽
};

#endif // DIALOGIO_H

dialog.cpp:

#include "dialogio.h"
#include "ui_dialogio.h"
#include <QPen>
#include <QBrush>

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

    //tag=1;      //标志等于1时绘制一条线
    //repaint(x =50,y=100,l=20,h=50);  //可以这样调用绘图函数

    tag=2;    //标志等于2时绘制一个矩形
    repaint(x =200,y=300,l=100,h=160);  //不使用这个也行,此只是为了方便我们多次调用。   painterEvent函数会自动调用。

}

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

void DialogIO::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);//使用前先创建一个qpainter画图对象
    QPen pen;   //画图对象有了没有🖊笔怎么画,所以要创建一个画笔

    /*
     * 画笔画出来的效果参数:
     * 实线:Qt::SolidLine
     * 各种虚线:Qt::DashLine,Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
    */
    //设置画笔的各种属性:样式,宽度,颜色等
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(3);
    pen.setBrush(Qt::black  );

    /*端点风格参数:
     * Qt::FlatCap
     * Qt::SqureCap
     * Qt::RoundCap
    */
    pen.setCapStyle(Qt::RoundCap);

    /*连接风格参数:
     * Qt::MiterJoin
     * Qt::BevelJoin
     * Qt::RoundJoin
    */
    pen.setJoinStyle(Qt::RoundJoin);

    painter.setPen(pen);    //painter绑定pen

    //新建一个画刷(涂色)    //绘制的图形有封闭空间的话就会在封闭空间图上brush的setcolor的颜色。
    QBrush brush;

    /*涂色的风格,参数太多,挑了几个:
     * 纯色:Qt::SolidPattern
     * 点状:Qt::Dense2Pattern
     * 左斜线:Qt::BDiagPattern
     * 右斜线:Qt::FDiagPattern
     * 正网格:Qt::CrossPattern
     * 斜网格:Qt::DiagCrossPattern
    */
    brush.setStyle(Qt::SolidPattern);
    brush.setColor(Qt::red);

    painter.setBrush(brush);    //painter绑定brush   //设置画刷有效

    //现在就可以随便画了
    if(tag==1)
    {
        painter.drawLine(x,y,l,h);
    }
    else if(tag==2)
    {
        painter.drawRect(x,y,l,h);
    }

}

运行效果:


 。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值