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

  • 相关阅读:
    Nmap 網路診斷工具基本使用技巧與教學
    你必须了解的基础的 Linux 网络命令
    SQLAlchemy 一对多
    Linux统计文件行数
    网络拥塞控制(三) TCP拥塞控制算法
    JavaSe:Properties文件格式
    ZooKeeper:第三方客户端 ZKClient
    ab
    JDWP Agent
    ZooKeeper:数据模型
  • 原文地址:https://www.cnblogs.com/findumars/p/8635449.html
Copyright © 2011-2022 走看看