zoukankan      html  css  js  c++  java
  • 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)

    利用QPainter绘制各种图形


    Qt的二维图形引擎是基于QPainter类的。QPainter既可以绘制几何形状(点、线、矩形、椭圆、弧形、弦形、饼状图、多边形和贝塞尔曲线),也可以绘制像素映射、图像和文字。此外,QPainter还支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等。QPainter也支持线性变换,例如平移、旋转、错切和缩放。


    本例子中利用QPainter类提供的各种draw函数,绘制各种类型的图形,包括对图形的形状、颜色、填充风格等的选择。 
    1、创建paintarea.h

    #ifndef PAINTAREA_H
    #define PAINTAREA_H
    
    #include <QtGui>
    
    class PaintArea : public QWidget
    {
        Q_OBJECT
    
    public:
        enum Shape {Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap};
        PaintArea(QWidget *parent = 0);
    
        void setShape(Shape);
        void setPen(QPen);
        void setBrush(QBrush);
    
        void paintEvent(QPaintEvent *);
    
    private:
        Shape shape;
        QBrush brush;
        QPen pen;
    };
    #endif // PAINTAREA_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2、创建paintarea.cpp文件

    #include "paintarea.h"
    
    PaintArea::PaintArea(QWidget *parent) : QWidget(parent)
    {
        shape = Line;
        QPalette p = palette();
        p.setColor(QPalette::Window,Qt::white);
        setPalette(p);
        setAutoFillBackground(true);
    
        setMinimumSize(400,400);
    }
    
    void PaintArea::setShape(Shape s)
    {
        shape = s;
        update();
    }
    
    void PaintArea::setPen(QPen p)
    {
        pen = p;
        update();
    }
    
    void PaintArea::setBrush(QBrush b)
    {
        brush = b;
        update();
    }
    
    void PaintArea::paintEvent(QPaintEvent *)
    {
        QPainter p(this);
        p.setPen(pen);
        p.setBrush(brush);
    
        QRect rect(50,100,300,200);
    
        static const QPoint points[4] = {
            QPoint(150,100),
            QPoint(300,150),
            QPoint(350,250),
            QPoint(100,300)
        };
    
        int startAngle = 30 * 16;
        int spanAngle = 120 * 16;
    
        QPainterPath path;
        path.addRect(150,150,100,100);
        path.moveTo(100,100);
        path.cubicTo(300,100,200,200,300,300);
        path.cubicTo(100,300,200,200,100,100);
    
        switch(shape)
        {
            case Line:
                p.drawLine(rect.topLeft(),rect.bottomRight());
                break;
            case Rectangle:
                p.drawRect(rect);
                break;
            case RoundRect:
                p.drawRoundRect(rect);
                break;
            case Ellipse:
                p.drawEllipse(rect);
                break;
            case Polygon:
                p.drawPolygon(points,4);
                break;
            case Polyline:
                p.drawPolyline(points,4);
                break;
            case Points:
                p.drawPoints(points,4);
                break;
            case Arc:
                p.drawArc(rect,startAngle,spanAngle);
                break;
            case Path:
                p.drawPath(path);
                break;
            case Text:
                p.drawText(rect,Qt::AlignCenter,tr("Hello Qt"));
                break;
            case Pixmap:
                p.drawPixmap(150,150,QPixmap(":/images/butterfly.png"));
                break;
            default:
                break;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95

    3、创建mainwidget.h

    #ifndef MAINWIDGET_H
    #define MAINWIDGET_H
    
    #include <QtGui>
    #include "paintarea.h"
    
    class MainWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        MainWidget(QWidget *parent = 0);
    
    public slots:
        void slotShape(int);
        void slotPenWidth(int);
        void slotPenColor();
        void slotPenStyle(int);
        void slotPenCap(int);
        void slotPenJoin(int);
        void slotBrush(int);
    
    private:
        PaintArea *area;
    
        QComboBox *shapeComboBox;
        QSpinBox *widthSpinBox;
        QComboBox *penStyleComboBox;
        QComboBox *penCapComboBox;
        QComboBox *penJoinComboBox;
        QComboBox *brushStyleComboBox;
        QFrame *colorFrame;
    };
    
    #endif // MAINWIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    4、创建mainwidget.cpp

    #include "mainwidget.h"
    
    MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
    {
        area = new PaintArea;
    
        QLabel *label1 = new QLabel(tr("Shape:"));
        QLabel *label2 = new QLabel(tr("Pen Width:"));
        QLabel *label3 = new QLabel(tr("Pen Color:"));
        QLabel *label4 = new QLabel(tr("Pen Style:"));
        QLabel *label5 = new QLabel(tr("Pen Cap:"));
        QLabel *label6 = new QLabel(tr("Pen Join:"));
        QLabel *label7 = new QLabel(tr("Brush:"));
    
        shapeComboBox = new QComboBox;
        shapeComboBox->addItem(tr("Line"), PaintArea::Line);
        shapeComboBox->addItem(tr("Polygon"), PaintArea::Polygon);
        shapeComboBox->addItem(tr("Rectangle"), PaintArea::Rectangle);
        shapeComboBox->addItem(tr("Round Rectangle"), PaintArea::RoundRect);
        shapeComboBox->addItem(tr("Ellipse"), PaintArea::Ellipse);
        shapeComboBox->addItem(tr("Path"), PaintArea::Path);
        shapeComboBox->addItem(tr("Polyline"), PaintArea::Polyline);
        shapeComboBox->addItem(tr("Arc"), PaintArea::Arc);
        shapeComboBox->addItem(tr("Points"), PaintArea::Points);
        shapeComboBox->addItem(tr("Text"), PaintArea::Text);
        shapeComboBox->addItem(tr("Pixmap"), PaintArea::Pixmap);
        connect(shapeComboBox,SIGNAL(activated(int)),this,SLOT(slotShape(int)));
    
        widthSpinBox = new QSpinBox;
        widthSpinBox->setRange(0,20);
        connect(widthSpinBox,SIGNAL(valueChanged(int)),this,SLOT(slotPenWidth(int)));
    
        colorFrame = new QFrame;
        colorFrame->setAutoFillBackground(true);
        colorFrame->setPalette(QPalette(Qt::blue));
        QPushButton *colorPushButton = new QPushButton(tr("change"));
        connect(colorPushButton,SIGNAL(clicked()),this,SLOT(slotPenColor()));
    
        penStyleComboBox = new QComboBox;
        penStyleComboBox->addItem(tr("Solid"), Qt::SolidLine);
        penStyleComboBox->addItem(tr("Dash"), Qt::DashLine);
        penStyleComboBox->addItem(tr("Dot"), Qt::DotLine);
        penStyleComboBox->addItem(tr("Dash Dot"), Qt::DashDotLine);
        penStyleComboBox->addItem(tr("Dash Dot Dot"), Qt::DashDotDotLine);
        penStyleComboBox->addItem(tr("None"), Qt::NoPen);
        connect(penStyleComboBox,SIGNAL(activated(int)),this,SLOT(slotPenStyle(int)));
    
        penCapComboBox = new QComboBox;
        penCapComboBox->addItem(tr("Flat"), Qt::FlatCap);
        penCapComboBox->addItem(tr("Square"), Qt::SquareCap);
        penCapComboBox->addItem(tr("Round"), Qt::RoundCap);
        connect(penCapComboBox,SIGNAL(activated(int)),this,SLOT(slotPenCap(int)));
    
        penJoinComboBox = new QComboBox;
        penJoinComboBox->addItem(tr("Miter"), Qt::MiterJoin);
        penJoinComboBox->addItem(tr("Bevel"), Qt::BevelJoin);
        penJoinComboBox->addItem(tr("Round"), Qt::RoundJoin);
        connect(penJoinComboBox,SIGNAL(activated(int)),this,SLOT(slotPenJoin(int)));
    
        brushStyleComboBox = new QComboBox;
        brushStyleComboBox->addItem(tr("Linear Gradient"),
                 Qt::LinearGradientPattern);
        brushStyleComboBox->addItem(tr("Radial Gradient"),
                 Qt::RadialGradientPattern);
        brushStyleComboBox->addItem(tr("Conical Gradient"),
                 Qt::ConicalGradientPattern);
        brushStyleComboBox->addItem(tr("Texture"), Qt::TexturePattern);
        brushStyleComboBox->addItem(tr("Solid"), Qt::SolidPattern);
        brushStyleComboBox->addItem(tr("Horizontal"), Qt::HorPattern);
        brushStyleComboBox->addItem(tr("Vertical"), Qt::VerPattern);
        brushStyleComboBox->addItem(tr("Cross"), Qt::CrossPattern);
        brushStyleComboBox->addItem(tr("Backward Diagonal"), Qt::BDiagPattern);
        brushStyleComboBox->addItem(tr("Forward Diagonal"), Qt::FDiagPattern);
        brushStyleComboBox->addItem(tr("Diagonal Cross"), Qt::DiagCrossPattern);
        brushStyleComboBox->addItem(tr("Dense 1"), Qt::Dense1Pattern);
        brushStyleComboBox->addItem(tr("Dense 2"), Qt::Dense2Pattern);
        brushStyleComboBox->addItem(tr("Dense 3"), Qt::Dense3Pattern);
        brushStyleComboBox->addItem(tr("Dense 4"), Qt::Dense4Pattern);
        brushStyleComboBox->addItem(tr("Dense 5"), Qt::Dense5Pattern);
        brushStyleComboBox->addItem(tr("Dense 6"), Qt::Dense6Pattern);
        brushStyleComboBox->addItem(tr("Dense 7"), Qt::Dense7Pattern);
        brushStyleComboBox->addItem(tr("None"), Qt::NoBrush);
        connect(brushStyleComboBox,SIGNAL(activated(int)),this,SLOT(slotBrush(int)));
    
        QGridLayout *ctrlLayout = new QGridLayout;
        int labelCol = 0;
        int contentCol = 1;
        ctrlLayout->addWidget(label1,0,labelCol);
        ctrlLayout->addWidget(shapeComboBox,0,contentCol);
        ctrlLayout->addWidget(label2,1,labelCol);
        ctrlLayout->addWidget(widthSpinBox,1,contentCol);
        ctrlLayout->addWidget(label3,2,labelCol);
        ctrlLayout->addWidget(colorFrame,2,contentCol);
        ctrlLayout->addWidget(colorPushButton,2,2);
        ctrlLayout->addWidget(label4,3,labelCol);
        ctrlLayout->addWidget(penStyleComboBox,3,contentCol);
        ctrlLayout->addWidget(label5,4,labelCol);
        ctrlLayout->addWidget(penCapComboBox,4,contentCol);
        ctrlLayout->addWidget(label6,5,labelCol);
        ctrlLayout->addWidget(penJoinComboBox,5,contentCol);
        ctrlLayout->addWidget(label7,6,labelCol);
        ctrlLayout->addWidget(brushStyleComboBox,6,contentCol);
    
        QHBoxLayout *mainLayout = new QHBoxLayout;
        mainLayout->addWidget(area);
        mainLayout->addLayout(ctrlLayout);
        mainLayout->setMargin(10);
        mainLayout->setSpacing(10);
    
        setLayout(mainLayout);
    
        slotShape(0);
        slotPenWidth(0);
        slotPenStyle(0);
        slotPenCap(0);
        slotPenJoin(0);
        slotBrush(0);
    }
    
    
    void MainWidget::slotShape(int value)
    {
        PaintArea::Shape shape = PaintArea::Shape(shapeComboBox->itemData(value,Qt::UserRole).toInt());
        area->setShape(shape);
    }
    
    void MainWidget::slotPenWidth(int value)
    {
        QColor color = colorFrame->palette().color(QPalette::Window);
         Qt::PenStyle style = Qt::PenStyle(penStyleComboBox->itemData(
                 penStyleComboBox->currentIndex(), Qt::UserRole).toInt());
         Qt::PenCapStyle cap = Qt::PenCapStyle(penCapComboBox->itemData(
                 penCapComboBox->currentIndex(), Qt::UserRole).toInt());
         Qt::PenJoinStyle join = Qt::PenJoinStyle(penJoinComboBox->itemData(
                 penJoinComboBox->currentIndex(), Qt::UserRole).toInt());
    
         area->setPen(QPen(color, value, style, cap, join));
    }
    
    void MainWidget::slotPenColor()
    {
        QColor color = QColorDialog::getColor(Qt::blue);
    
        colorFrame->setPalette(QPalette(color));
    
        int width = widthSpinBox->value();
        Qt::PenStyle style = Qt::PenStyle(penStyleComboBox->itemData(
                 penStyleComboBox->currentIndex(), Qt::UserRole).toInt());
        Qt::PenCapStyle cap = Qt::PenCapStyle(penCapComboBox->itemData(
                 penCapComboBox->currentIndex(),  Qt::UserRole).toInt());
        Qt::PenJoinStyle join = Qt::PenJoinStyle(penJoinComboBox->itemData(
                 penJoinComboBox->currentIndex(),  Qt::UserRole).toInt());
    
        area->setPen(QPen(color, width, style, cap, join));
    }
    
    void MainWidget::slotPenStyle(int value)
    {
        int width = widthSpinBox->value();
        QColor color = colorFrame->palette().color(QPalette::Window);
        Qt::PenStyle style = Qt::PenStyle(penStyleComboBox->itemData(value,  Qt::UserRole).toInt());
        Qt::PenCapStyle cap = Qt::PenCapStyle(penCapComboBox->itemData(
                 penCapComboBox->currentIndex(),  Qt::UserRole).toInt());
        Qt::PenJoinStyle join = Qt::PenJoinStyle(penJoinComboBox->itemData(
                 penJoinComboBox->currentIndex(),  Qt::UserRole).toInt());
    
        area->setPen(QPen(color, width, style, cap, join));
    }
    
    void MainWidget::slotPenCap(int value)
    {
        int width = widthSpinBox->value();
        QColor color = colorFrame->palette().color(QPalette::Window);
        Qt::PenStyle style = Qt::PenStyle(penStyleComboBox->itemData(
                 penStyleComboBox->currentIndex(),  Qt::UserRole).toInt());
        Qt::PenCapStyle cap = Qt::PenCapStyle(penCapComboBox->itemData(value,  Qt::UserRole).toInt());
        Qt::PenJoinStyle join = Qt::PenJoinStyle(penJoinComboBox->itemData(
                 penJoinComboBox->currentIndex(),  Qt::UserRole).toInt());
    
        area->setPen(QPen(color, width, style, cap, join));
    }
    
    
    void MainWidget::slotPenJoin(int value)
    {
        int width = widthSpinBox->value();
        QColor color = colorFrame->palette().color(QPalette::Window);
        Qt::PenStyle style = Qt::PenStyle(penStyleComboBox->itemData(
                 penStyleComboBox->currentIndex(),  Qt::UserRole).toInt());
        Qt::PenCapStyle cap = Qt::PenCapStyle(penCapComboBox->itemData(
                 penCapComboBox->currentIndex(),  Qt::UserRole).toInt());
        Qt::PenJoinStyle join = Qt::PenJoinStyle(penJoinComboBox->itemData(value,  Qt::UserRole).toInt());
    
        area->setPen(QPen(color, width, style, cap, join));
    }
    
    void MainWidget::slotBrush(int value)
    {
         Qt::BrushStyle style = Qt::BrushStyle(brushStyleComboBox->itemData(value, Qt::UserRole).toInt());
    
         if (style == Qt::LinearGradientPattern) {
             QLinearGradient linearGradient(0, 0, 400, 400);
             linearGradient.setColorAt(0.0, Qt::white);
             linearGradient.setColorAt(0.2, Qt::green);
             linearGradient.setColorAt(1.0, Qt::black);
             area->setBrush(linearGradient);
         } else if (style == Qt::RadialGradientPattern) {
             QRadialGradient radialGradient(200, 200, 150, 150, 100);
             radialGradient.setColorAt(0.0, Qt::white);
             radialGradient.setColorAt(0.2, Qt::green);
             radialGradient.setColorAt(1.0, Qt::black);
             area->setBrush(radialGradient);
         } else if (style == Qt::ConicalGradientPattern) {
             QConicalGradient conicalGradient(200, 200, 30);
             conicalGradient.setColorAt(0.0, Qt::white);
             conicalGradient.setColorAt(0.2, Qt::green);
             conicalGradient.setColorAt(1.0, Qt::black);
             area->setBrush(conicalGradient);
         } else if (style == Qt::TexturePattern) {
             area->setBrush(QBrush(QPixmap(":/images/cheese.jpg")));
         } else {
             area->setBrush(QBrush(Qt::green, style));
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225

    5、创建资源文件paintbasic.qrc 
    6、创建main.cpp

    #include <QApplication>
    #include "mainwidget.h"
    
    int main(int argc, char * argv[])
    {
        QApplication app(argc,argv);
    
        MainWidget w;
        w.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6、编译运行 
    这里写图片描述

    7、资源代码文件

    https://blog.csdn.net/onlyshi/article/details/47953849

  • 相关阅读:
    Chandy-Lamport_algorithm
    3 differences between Savepoints and Checkpoints in Apache Flink
    列数 行数 表数 限制
    数据收集、传输、元数据管理、作业流调度、海量数据查询引擎、数据可视化
    分析云负载均衡产品
    端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
    JSON Web Token
    查看开启端口的应用
    If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r
    微服务架构的理论基础
  • 原文地址:https://www.cnblogs.com/findumars/p/8635449.html
Copyright © 2011-2022 走看看