QT绘图进阶

QT绘图进阶

1、界面布局

参考链接:大轮明王讲QT

最终效果: Label、ComboBox、CheckBox、GroupBox ,pushbotton
在这里插入图片描述

1.1创建

先创建一个widget项目,在这个项目新建一个c++ painterX 继承widget ,类名PaintWidget

样式表

QWidget
{  
	font:  14pt "Microsoft YaHei";
    color:  #000000;
}

QGroupBox {
    border-width: 1px;
	border-style: solid;
	margin-top:10px
}

QGroupBox::title {
    subcontrol-origin: margin;
    left:20px;
    padding: -10px 5px 0px 5px;
}

中间的 PaintWidget

为了便于查看,将其背景色修改为白色,修改其样式表
background-color: rgb(255, 255, 255);

为 PaintWidget 添加了以上样式表之后,运行后样式表不起作用,需要增加以下代码
PaintWidget::PaintWidget(QWidget *parent) : QWidget{parent}
{
    this->setAttribute(Qt::WA_StyledBackground, true);
}

一些细节
在这里插入图片描述

2、给各个控件赋值,初始化数据

2.1图形形状

枚举类型

 enum Shape { 
    _Point,         // 点 
    _Line,          // 线 
     _Rect,          // 矩形 
    _RoundedRect,   // 圆角矩形 
    _Ellipse,       // 椭圆 
     _Polyline,      // 折线 
    _Polygon,       // 多边形 
     _Arc,           // 弧线 
    _Pie,           // 扇形 
    _Chord,         // 弦 
     _Path,          // 路径 
     _Text,          // 文本 
    _Pixmap         // 图像 
};
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //图形形状选项
    //这段代码是用于向名为"shapeComboBox"的UI控件中添加一个选项,选项的文本是"Point",对应的值是_Point。
    //其中,static_cast<int>(_Point)是将枚举类型_Point转换为整数类型,以便在UI控件中进行存储和处理。
    ui->shapeComboBox->addItem("Point",static_cast<int>(_Point));
    ui->shapeComboBox->addItem("Line",static_cast<int>(_Line));
    ui->shapeComboBox->addItem("Rectangle",static_cast<int>(_Rect));
    ui->shapeComboBox->addItem("Rounded Rectangle",static_cast<int>(_RoundedRect));
    ui->shapeComboBox->addItem("Ellipse",static_cast<int>(_Ellipse));
    ui->shapeComboBox->addItem("Polyline",static_cast<int>(_Polyline));
    ui->shapeComboBox->addItem("Polygon",static_cast<int>(_Polygon));
    ui->shapeComboBox->addItem("Arc",static_cast<int>(_Arc));
    ui->shapeComboBox->addItem("Pie",static_cast<int>(_Pie));
    ui->shapeComboBox->addItem("Chord",static_cast<int>(_Chord));
    ui->shapeComboBox->addItem("Path",static_cast<int>(_Path));
    ui->shapeComboBox->addItem("Text",static_cast<int>(_Text));
    ui->shapeComboBox->addItem("Pixmap",static_cast<int>(_Pixmap));
}
2.2画笔
    //画笔属性设置
    //1.画笔宽度
    ui->widthSpinBox->setRange(1,10);

    //2.线形状
    ui->styleComboBox->addItem("Soild",static_cast<int>(Qt::SolidLine));
    ui->styleComboBox->addItem("Dash",static_cast<int>(Qt::DashLine));
    ui->styleComboBox->addItem("Dot",static_cast<int>(Qt::DotLine));
    ui->styleComboBox->addItem("Dash Dot",static_cast<int>(Qt::DashDotLine));
    ui->styleComboBox->addItem("Dash Dot Dot",static_cast<int>(Qt::DashDotDotLine));
    ui->styleComboBox->addItem("None",static_cast<int>(Qt::NoPen));

    //3.线的端点样式
    ui->endComboBox->addItem("Flat",static_cast<int>(Qt::FlatCap));
    ui->endComboBox->addItem("Square",static_cast<int>(Qt::SquareCap));
    ui->endComboBox->addItem("Round",static_cast<int>(Qt::RoundCap));

    //4.两根线的连接处的样式
    ui->connectComboBox->addItem("Miter",static_cast<int>(Qt::MiterJoin));
    ui->connectComboBox->addItem("Bevel",static_cast<int>(Qt::BevelJoin));
    ui->connectComboBox->addItem("Round",static_cast<int>(Qt::RoundJoin));
2.3画刷
    //画刷属性的设置
    //1.
    ui->styleBrushComboBox->addItem(tr("Linear Gradient"), static_cast<int>(Qt::LinearGradientPattern));
    ui->styleBrushComboBox->addItem(tr("Radial Gradient"), static_cast<int>(Qt::RadialGradientPattern));
    ui->styleBrushComboBox->addItem(tr("Conical Gradient"), static_cast<int>(Qt::ConicalGradientPattern));
    ui->styleBrushComboBox->addItem(tr("Texture"), static_cast<int>(Qt::TexturePattern));
    ui->styleBrushComboBox->addItem(tr("Solid"), static_cast<int>(Qt::SolidPattern));
    ui->styleBrushComboBox->addItem(tr("Horizontal"), static_cast<int>(Qt::HorPattern));
    ui->styleBrushComboBox->addItem(tr("Vertical"), static_cast<int>(Qt::VerPattern));
    ui->styleBrushComboBox->addItem(tr("Cross"), static_cast<int>(Qt::CrossPattern));
    ui->styleBrushComboBox->addItem(tr("Backward Diagonal"), static_cast<int>(Qt::BDiagPattern));
    ui->styleBrushComboBox->addItem(tr("Forward Diagonal"), static_cast<int>(Qt::FDiagPattern));
    ui->styleBrushComboBox->addItem(tr("Diagonal Cross"), static_cast<int>(Qt::DiagCrossPattern));
    ui->styleBrushComboBox->addItem(tr("Dense 1"), static_cast<int>(Qt::Dense1Pattern));
    ui->styleBrushComboBox->addItem(tr("Dense 2"), static_cast<int>(Qt::Dense2Pattern));
    ui->styleBrushComboBox->addItem(tr("Dense 3"), static_cast<int>(Qt::Dense3Pattern));
    ui->styleBrushComboBox->addItem(tr("Dense 4"), static_cast<int>(Qt::Dense4Pattern));
    ui->styleBrushComboBox->addItem(tr("Dense 5"), static_cast<int>(Qt::Dense5Pattern));
    ui->styleBrushComboBox->addItem(tr("Dense 6"), static_cast<int>(Qt::Dense6Pattern));
    ui->styleBrushComboBox->addItem(tr("Dense 7"), static_cast<int>(Qt::Dense7Pattern));
    ui->styleBrushComboBox->addItem(tr("None"), static_cast<int>(Qt::NoBrush));

3.绘制点、线

wight.h

public slots:
    void shapeChange();

wight.cpp

在wight函数中添加
    Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
        ···
        //关联信号曹
    connect(ui->shapeComboBox,SIGNAL(activated(QString)),this,SLOT(shapeChange()));
    }


void Widget::shapeChange()
{
    int index = ui->shapeComboBox->currentIndex();
    Shape shape = (Shape)ui->shapeComboBox->itemData(index).toInt();

    ui->widget->setShape(shape);
}


painterwight.h

protected:
    void paintEvent(QPaintEvent *event);
public slots:
    void setShape(Shape shape);
private:
    Shape mShape;

painterwight.cpp 知识点:平移translate()update()

void PainterWidget::setShape(Shape shape)
{
    this->mShape = shape;
    update();
}

//paintEvent 是什么?

//paintEvent 是一个绘图函数,它是并不是由我们手动调用的, 而是由系统自动调用的。
//调用时机:
//窗口大小变化时
//比如最大化、最小化、缩放窗口时,系统都会调用该函数
//手动调用 update
//手动调用 update 函数,同样会触发系统调用 paintEvent,从而完成界面的刷新。

void PainterWidget::paintEvent(QPaintEvent *event)
{
    static const QPoint points[4] = {
        QPoint(10,80),
        QPoint(20,10),
        QPoint(80,30),
        QPoint(90,70),
    };

    //创建画家类的对象,参数为绘图设备,指定为this,表示在当前的窗口绘制
    QPainter painter(this);

    //让形状平移100距离铺满整个界面
    for (int x = 0 ; x < this->width() ; x+=100) {
        for (int y = 0 ; y < this->height() ; y+=100) {
            //保存位置
            painter.save();

            //平移-translate:它的作用是,移动绘图的坐标原点
            //有了平移的方法,就可以直接移动绘图的坐标原点,这样线段的两个端点的坐标就不需要改变
            painter.translate(x,y);

            //绘制很多个图形,switch来选择
            switch( mShape )
            {
                //点,线
                case _Point:
                    painter.drawPoints(points,4);
                    break;
                case _Line:
                    painter.drawLine(points[0],points[2]);
                    break;
                    
                //多段线,多边形
                case _Polyline: 
                    painter.drawPolyline(points,4);
                    break;
                case _Polygon: 
                    painter.drawPolygon(points,4);
                    break; 
            }

            //恢复
            painter.restore();
        }
    }
}

4、矩形,圆角矩形

4.1 矩形
// 带 F 表示参数为浮点数,否则为整型数
void drawRect(const QRectF &rectangle)
void drawRect(const QRect &rectangle)

// 指定左上角的顶点,以及宽高
void drawRect(int x, int y, int width, int height)
4.2 圆角矩形
// 带 F 表示参数为浮点数,否则为整型数
void drawRoundedRect(const QRectF &rect, 
                     qreal xRadius, 
                     qreal yRadius, 
                     Qt::SizeMode mode = Qt::AbsoluteSize)
void drawRoundedRect(const QRect &rect, 
                     qreal xRadius, 
                     qreal yRadius, 
                     Qt::SizeMode mode = Qt::AbsoluteSize)
    
void drawRoundedRect(int x, int y, int w, int h, 
                     qreal xRadius, 
                     qreal yRadius, 
                     Qt::SizeMode mode = Qt::AbsoluteSize)
其中,最后一个参数为 Qt::SizeMode 类型的枚举,取值为:

Qt::AbsoluteSize xRadius 和 yRadius 为圆角大小
Qt::RelativeSize xRadius 和 yRadius 为圆角百分比

void PainterWidget::paintEvent(QPaintEvent *event)
当中写

//矩形 (x,y,width,height)
  QRect rect(10,20,80,60);

switch里面增加
//矩形,圆角矩形
  case _Rect:
       painter.drawRect(rect);
       reak;
  case _RoundedRect:
       painter.drawRoundedRect(rect,25,25,Qt::RelativeSize); //相对的,为百分比
       break;

5、椭圆、圆

// 直接制定一个矩形
void drawEllipse(const QRectF &rectangle);
void drawEllipse(const QRect &rectangle);

// 通过左上角的顶点和宽高,来指定一个矩形
void drawEllipse(int x, int y, int width, int height);	

// 通过指定中心 和 rx、ry
void drawEllipse(const QPointF &center, qreal rx, qreal ry);
void drawEllipse(const QPoint &center, int rx, int ry);

6、圆弧,饼图,弦图

关于矩形参数的理解:
圆弧,饼图,弦图可以看作就是矩形内部的内心圆进行的截取
矩形参数定义了一个矩形区域,圆弧将被绘制在该区域内部。圆弧的起始角度和结束角度将根据矩形的位置和大小来确定。
总结起来,矩形参数用于确定圆弧所在的矩形区域,进而确定圆弧的位置和大小

在这里插入图片描述

6.1 圆弧

绘制圆弧时,需要指定一个矩形,以及开始角度 startAngel、跨度角度 spanAngle
角度的起始零点为时钟三点钟位置,逆时针增加。一圈的跨度为360x16,半圈为180x16

开始角度和偏移角度决定了扇形绘制的弧长,
Qt中一个完整的圆分为5760 等分(360*16),在指定角度时,角度数需要乘16
同时需要注意,弧度和角度的转换。

// 直接指定一个矩形对象
void drawChord(const QRectF &rectangle, int startAngle, int spanAngle);
void drawChord(const QRect &rectangle, int startAngle, int spanAngle);

// 通过指定左上角的顶点和宽高来指定一个矩形
void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle);
6.2饼图,弦图

参数都一样,换个参数名就行,drawPiedrawChord

void PaintWidget::paintEvent(QPaintEvent *event)
{
    //矩形,起始角,偏移角
    QRect rect2(10,10,80,80);
    int startAngle = 30 * 16;
    int arcLength = 120 * 16;

    for ( int x = 0; x < width(); x += 100 ) {
        for ( int y = 0; y < height(); y += 100 ) {
            
            ...
                
            switch ( mShape ) {
                // 路径
                //圆弧,饼图,弦图
                case _Arc:
                    painter.drawArc(rect2,startAngle,arcLength);
                    break;
                case _Pie:
                    painter.drawPie(rect2, startAngle, arcLength);
                    break;
                case _Chord:
                    painter.drawChord(rect2, startAngle, arcLength);
                    break;
            }
            ...  
        }
    }
}

7、路径图

drawPath 需要一个 QPainterPath 对象,其常用方法

// 移动到指定的点,开始指定路径
void moveTo(const QPointF &point);
void moveTo(qreal x, qreal y);

// 以直线的方式,路径到指定的点
void lineTo(const QPointF &endPoint);
void lineTo(qreal x, qreal y);

// 以贝瑟尔曲线的方式,路径到指定的点
// 具体来说:使用控制点c1和c2,在当前点和结束点之间,绘制一条贝瑟尔曲线
void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint);
void cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY);

贝瑟尔曲线理解
在这里插入图片描述
.

void PaintWidget::paintEvent(QPaintEvent *event)
{
    QPainterPath path;
    path.moveTo(20, 80);
    path.lineTo(20, 30);
    // path.cubicTo(80, 0, 50, 50, 80, 80);
    path.cubicTo(QPoint(80, 0), QPoint(50, 50), QPoint(80, 80));

    for ( int x = 0; x < width(); x += 100 ) {
        for ( int y = 0; y < height(); y += 100 ) {
            
            ...
                
            switch ( mShape ) {
                // 路径
                case _Path:
                    painter.drawPath(path);
                    break;
            }
            ...  
        }
    }
}

8、文本、图片

8.1文本
// 通过指定矩形,来绘制文本
void drawText(const QRectF &rectangle, 
              int flags, 
              const QString &text, 
              QRectF *boundingRect = nullptr);
void drawText(int x, 
              int y, 
              const QString &text);
void drawText(const QRect &rectangle, 
              int flags, 
              const QString &text, 
              QRect *boundingRect = nullptr);
void drawText(int x, 
              int y, 
              int width, 
              int height, 
              int flags, 
              const QString &text, 
              QRect *boundingRect = nullptr);
void drawText(const QRectF &rectangle, 
              const QString &text, 
              const QTextOption &option = QTextOption());

// 通过指定点,来绘制文本
void drawText(const QPointF &position, const QString &text);
void drawText(const QPoint &position, const QString &text);
8.1图片
// 通过指定矩形,来绘制图片
void drawPixmap(const QRectF &target, 
                const QPixmap &pixmap, 
                const QRectF &source);
void drawPixmap(const QRect &target, 
                const QPixmap &pixmap, 
                const QRect &source);
void drawPixmap(int x, 
                int y, 
                int w, 
                int h, 
                const QPixmap &pixmap, 
                int sx, 
                int sy, 
                int sw, 
                int sh);
void drawPixmap(const QRect &rectangle, 
                const QPixmap &pixmap);
void drawPixmap(int x, 
                int y, 
                int width, 
                int height, 
                const QPixmap &pixmap);
    
// 通过指定点,来绘制图片
void drawPixmap(const QPointF &point, 
                const QPixmap &pixmap, 
                const QRectF &source);
void drawPixmap(const QPoint &point, 
                const QPixmap &pixmap, 
                const QRect &source);
void drawPixmap(const QPointF &point, 
                const QPixmap &pixmap);
void drawPixmap(const QPoint &point, 
                const QPixmap &pixmap);
void drawPixmap(int x, 
                int y, 
                const QPixmap &pixmap);
void drawPixmap(int x, 
                int y, 
                const QPixmap &pixmap, 
                int sx, 
                int sy, 
                int sw, 
                int sh);
 QRect rect(10,20,80,60);
// 文本、图片
   case _Text:
        painter.drawText(rect, Qt::AlignCenter, "江门\n肥猪");
        break;
   case _Pixmap:
        painter.drawPixmap(rect, QPixmap(":/image/qt.png"),rect);
        break;

9、画笔设置

宽度 颜色 样式 末端 连接
 Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{   
        ···
    
   //2.画笔属性设置
    //宽度
    connect(ui->widthSpinBox,SIGNAL(valueChanged(int)),this,SLOT(penChanged()));
    //颜色
    connect(ui->colorpushButton,SIGNAL(clicked()),this,SLOT(onBtnPenColorClicked()));
    //样式
    connect(ui->styleComboBox,SIGNAL(activated(QString)),this,SLOT(penChanged()));
    //末端
    connect(ui->endComboBox,SIGNAL(activated(QString)),this,SLOT(penChanged()));
    //连接
    connect(ui->connectComboBox,SIGNAL(activated(QString)),this,SLOT(penChanged()));
}

知识点QPaletteQPalette::Button 、setFlat(true)

QPalette是Qt框架提供的一个类,用于管理和设置控件的调色板(palette)。调色板包含了一系列颜色,用于定义控件的前景色、背景色、文本颜色等。 QPalette的主要作用是为了控制和定制控件的外观。通过设置不同的颜色,可以改变控件的外观效果,使其适应不同的主题或用户需求。

QPalette::Button指的是定义按钮部件的背景颜色的角色。QPalette::Button角色用于设置QPushButton、QToolButton和QCheckBox等按钮元素的颜色。通过设置QPalette::Button的颜色,您可以自定义应用程序中按钮的背景颜色

setFlat(true)属性用于移除按钮的默认样式,例如边框和阴影等,这些样式有时会干扰按钮颜色的显示。通过设置 setFlat(true) ,你可以使按钮看起来像一个平面表面,没有任何额外的样式效果。这样可以更突出地显示按钮的颜色,而不会有任何干扰。

void Widget::onBtnPenColorClicked()
{
    //调取颜色对话框
    QColor color = QColorDialog::getColor(QColor(255,0,0),this,"画笔颜色");
    //如果取消就直接退出
    if(!color.isValid())
    {
        return;
    }

    //让选择的颜色显示到颜色按钮上面

    // 获取colorpushButton的调色板
    QPalette pal = ui->colorpushButton->palette();
    // 设置按钮在调色板中的颜色
    //QPalette::Button指的是定义按钮部件的背景颜色的角色。。
    pal.setColor(QPalette::Button, color);
    // 将修改后的调色板应用到colorpushButton上
    ui->colorpushButton->setPalette(pal);
    // 启用自动填充背景功能,使按钮的背景颜色生效
    ui->colorpushButton->setAutoFillBackground(true);
    // 设置按钮为扁平样式,使其看起来是平面的
    ui->colorpushButton->setFlat(true);


    penChanged();
}

void Widget::penChanged()
{
    //获取界面上控件的内容

    //宽度
    int width = ui->widthSpinBox->value();

    //颜色
    QPalette pal =ui->colorpushButton->palette();
    QColor color = pal.color(QPalette::Button);

    //样式
//    1. 获取当前选择的样式索引:使用 ui->styleComboBox->currentIndex() 获取下拉框 styleComboBox 当前选中的索引,		   即 styleIndex 。
//    2. 获取选中样式的数据:使用 ui->styleComboBox->itemData(styleIndex) 获取选中样式的数据。这里的数据是通过 			 setItemData() 方法设置的,可以是任意类型的数据。
//    3. 将数据转换为Qt的PenStyle类型:使用 .toInt() 将获取到的数据转换为整数类型,并强制转换为 Qt::PenStyle 枚举类		     型,赋值给 style 变量。
//    通过这段代码,可以获取到下拉框中选中样式的索引和对应的 Qt::PenStyle 枚举类型的值,以便后续使用。
    int styleIndex = ui->styleComboBox->currentIndex();
    Qt::PenStyle style = (Qt::PenStyle)ui->styleComboBox->itemData(styleIndex).toInt();


    //末端
    int endIndex = ui->endComboBox->currentIndex();
    Qt::PenCapStyle end = (Qt::PenCapStyle)ui->endComboBox->itemData(endIndex).toInt();

    //连接
    int JoinIndex = ui->connectComboBox->currentIndex();
    Qt::PenJoinStyle join = (Qt::PenJoinStyle)ui->connectComboBox->itemData(JoinIndex).toInt();

    //最后是在painterwight上显示的,在设置setPen函数,调用这个函数,传参数过去
    ui->widget->setPen(QPen(color,width,style,end,join));
}

painterwight.h

public slots:
    void setShape(Shape shape);
    void setPen(const QPen &pen);
private:
    Shape mShape;
    QPen mPen;

painterwight.cpp

void PainterWidget::setPen(const QPen &pen)
{
    this->mPen = pen;
    update();
}

void PainterWidget::paintEvent(QPaintEvent *event)
{
    ```
        
    //创建画家类的对象,参数为绘图设备,指定为this,表示在当前的窗口绘制
    QPainter painter(this);
    //这里设置画笔,先设置画笔
    painter.setPen(mPen);
    
    ```
}
优化
 Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{   
        ···
    

//初始化画笔的颜色
    QPalette pal = ui->colorpushButton->palette();
    pal.setColor(QPalette::Button, QColor(0, 170, 0));
    ui->colorpushButton->setPalette(pal);
    ui->colorpushButton->setAutoFillBackground(true);
    ui->colorpushButton->setFlat(true);
    this->penChanged();
        
    }

10、画刷设置

颜色,样式
 Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{   
        ···
    
    //3.画刷样式设置
    //颜色
    connect(ui->colorBrushbtn,SIGNAL(clicked()),this,SLOT(onBtnBrushColorClicked()));
    //样式
    connect(ui->styleBrushComboBox,SIGNAL(activated(QString)),this,SLOT(brushChanged()));
        
    }


void Widget::onBtnBrushColorClicked()
{
    //调取颜色对话框
    QColor color = QColorDialog::getColor(QColor(255,0,0),this,"画刷颜色");
    //如果取消就直接退出
    if(!color.isValid())
    {
        return;
    }

    //让选择的颜色显示到颜色按钮上面

    // 获取colorpushButton的调色板
    QPalette pal = ui->colorBrushbtn->palette();
    // 设置按钮在调色板中的颜色
    //QPalette::Button指的是定义按钮部件的背景颜色的角色。。
    pal.setColor(QPalette::Button, color);
    // 将修改后的调色板应用到colorpushButton上
    ui->colorBrushbtn->setPalette(pal);
    // 启用自动填充背景功能,使按钮的背景颜色生效
    ui->colorBrushbtn->setAutoFillBackground(true);
    // 设置按钮为扁平样式,使其看起来是平面的 ,移除按钮的默认样式
    ui->colorBrushbtn->setFlat(true);

    brushChanged();
}

void Widget::brushChanged()
{
    //颜色
    QPalette pal =ui->colorBrushbtn->palette();
    QColor color = pal.color(QPalette::Button);

    //样式
    int styleIndex = ui->styleBrushComboBox->currentIndex();
    Qt::BrushStyle style = (Qt::BrushStyle)ui->styleBrushComboBox->itemData(styleIndex).toInt();

    //显示
    // 线性渐变
    if ( style == Qt::LinearGradientPattern )
    {
//        创建了一个线性渐变对象 linearGradient ,起点为 (0, 50) ,终点为 (100, 50) 。
//        然后,通过 setColorAt() 方法设置了渐变的颜色。
//        在位置0.0(起点)设置为白色,位置0.2设置为指定的 color 变量(假设已定义),位置1.0(终点)设置为黑色。
            QLinearGradient linearGradient(0, 50, 100, 50); //(x1,y1,x2,y2)
            linearGradient.setColorAt(0.0, Qt::white); //起始点
            linearGradient.setColorAt(0.2, color);     //到20%的时候换成color,我们指定的颜色
            linearGradient.setColorAt(1.0, Qt::black); //结束
            ui->widget->setBrush(linearGradient);
     }
    // 线径向渐变
    else if ( style == Qt::RadialGradientPattern )
    {
           //圆心50,50    半径50     焦点70,70 ,圆心向着焦点偏移
           //在位置0.0(中心点)设置为白色,位置0.2设置为指定的 color 变量(假设已定义),位置1.0(外边缘)设置为黑色
            QRadialGradient radialGradient(50, 50, 50, 70, 70);
            radialGradient.setColorAt(0.0, Qt::white);
            radialGradient.setColorAt(0.2, color);
            radialGradient.setColorAt(1.0, Qt::black);
            ui->widget->setBrush(radialGradient);
     }
    // 锥形渐变
    else if ( style == Qt::ConicalGradientPattern )
    {

            // QConicalGradient(qreal cx, qreal cy, qreal startAngle)
            QConicalGradient conicalGradient(50, 50, 150);
            conicalGradient.setColorAt(0.0, Qt::white);
            conicalGradient.setColorAt(0.2, color);
            conicalGradient.setColorAt(1.0, Qt::black);
            ui->widget->setBrush(conicalGradient);
     }
    // 纹理样式
    else if ( style == Qt::TexturePattern )
    {

            ui->widget->setBrush(QBrush(QPixmap(":/image/block.png")));
     }
    else
    {
            ui->widget->setBrush(QBrush(color,style));
    }
}

painterwight.h

public slots:
    void setShape(Shape shape);
    void setPen(const QPen &pen);
    void setBrush(const QBrush &brush);
private:
    Shape mShape;
    QPen mPen;
    QBrush mBrush;

painterwight.cpp

void PainterWidget::setBrush(const QBrush &brush)
{
    this->mBrush = brush;
    update();
}

void PainterWidget::paintEvent(QPaintEvent *event)
{
    ```
        
    //创建画家类的对象,参数为绘图设备,指定为this,表示在当前的窗口绘制
    QPainter painter(this);
    //这里设置画笔,先设置画笔
    painter.setPen(mPen);
    //设置画刷
    painter.setBrush(mBrush);
    
    ```
}

11、抗锯齿

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{  
    ```
        
     //4.抗锯齿
    connect(ui->renderHintCheckBox,&QCheckBox::toggled,[=](){
        antialiasChanged();
    });
        
            connect(ui->changecheckBox,&QCheckBox::toggled,[=](){
        transformChanged();
    });
        
 	```
}

void Widget::antialiasChanged()
{
    ui->widget->setAntialias(ui->renderHintCheckBox->isChecked());
}

12、旋转,平移,缩放

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{  
    ```

   connect(ui->changecheckBox,&QCheckBox::toggled,[=](){
        transformChanged();
    });
        
 	```
}

void Widget::transformChanged()
{
    ui->widget->setTransform(ui->changecheckBox->isChecked());
}

painterwight.h

public slots:
    void setShape(Shape shape);
    void setPen(const QPen &pen);
    void setBrush(const QBrush &brush);
    void setAntialias(bool antialias);
    void setTransform(bool transformed);
private:
    Shape mShape;
    QPen mPen;
    QBrush mBrush;
    bool mAntialias;
    bool mTransform;

painterwight.cpp

//抗锯齿
void PainterWidget::setAntialias(bool antialias)
{
    this->mAntialias = antialias;
    update();
}
//旋转,平移,缩放
void PainterWidget::setTransform(bool transformed)
{
    this->mTransform = transformed;
    update();
}
旋转,缩放
void PaintWidget::paintEvent(QPaintEvent *event)
{
    ···
        
    for ( int x = 0; x < width(); x += 100 ) {
        for ( int y = 0; y < height(); y += 100 ) {
            painter.save();
            painter.translate(x, y);  // translate 修改的是坐标系

            ···
                
            if ( mTransform ) {
                painter.translate(50, 50); //将圆心移动 x+50,y+50
                painter.rotate(90);		   //坐标轴顺时针旋转90度
                painter.scale(0.7,0.7);    //缩放0.7,0.7
                painter.translate(-50, -50); //将圆心移动 x-50,y-50
            }
            
            ···
        }
    }
    
    ···
}

.在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值