更多参见
QT基础与实例应用目录

代码链接

GitHub链接 :QPainterSimpleExample

介绍

结合实例介绍如何利用QPainter绘制各种图形,可绘制不同形状,使用不同画笔颜色画笔线宽画笔风格,选择不同画笔连接点,可设置不同的填充模式铺展效果渐变效果以及画刷颜色画刷风格等。

实现步骤

工程创建

如下图创建PaintExample工程,类名为QPainterMainWidget基类为QWidget,取消创建界面

右键工程添加以QWidget为基类的绘图显示区DisplayArea

这时除了main.cpp工程还包含qpaintermainwidget.cpp、qpaintermainwidget.h、displayarea.cpp、displayarea.h

绘图显示区实现

这里需要如下变量保存基本信息

    enum Shape{Line, // 直线  drawLine()Rect, // 长方形  drawRect()RoundedRect, // 圆角长方形 drawRoundedRect()Ellipse, // 椭圆形 drawEllipse()Polygon, // 多边形 drawPolygon()Polyline, // 多边线 drawPolyline()Points, // 点 drawPoints()Arc, // 弧 drawArc()Path, // 路径 drawPath(const QPainterPath &path)Text, // 文字 drawTextPixMap, // 图片 drawPixmap};
private:Shape shape; // shape类型QPen pen; // 画笔QBrush brush; // 画刷Qt::FillRule fillRule; // 路径和多边形 填充方法

参见Qt帮助手册,如下图QPainter 提供了绘制大多数图形的函数:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConvexPolygon() 和 drawCubicBezier()

利用 QPainterPath 类,通过函数 drawPath使用当前笔绘制轮廓,使用当前画笔进行填充,绘制给定的图形路径。通过函数drawText可以绘制文字。通过函数drawPixmap可以绘制图片。

displayarea.h

class DisplayArea : public QWidget
{Q_OBJECT
public:enum Shape{Line, // 直线  drawLine()Rect, // 长方形  drawRect()RoundedRect, // 圆角方形 drawRoundRect()Ellipse, // 椭圆形 drawEllipse()Polygon, // 多边形 drawPolygon()Polyline, // 多边线 drawPolyline()Points, // 点 drawPoints()Arc, // 弧 drawArc()Path, // 路径 drawPath(const QPainterPath &path)Text, // 文字 drawTextPixMap, // 图片 drawPixmap};public:explicit DisplayArea(QWidget *parent = nullptr);void setShape(Shape shape);void setPen(QPen pen);void setBrush(QBrush brush);void setFillRule(Qt::FillRule fillRule);void paintEvent(QPaintEvent *event) override; // 重绘事件
signals:
private:Shape shape; // shape类型QPen pen; // 画笔QBrush brush; // 画刷Qt::FillRule fillRule; // 路径和多边形 填充方法
};

设置窗体背景颜色

利用QPalette参见QT基础之QPalette类

DisplayArea::DisplayArea(QWidget *parent) : QWidget(parent)
{// 设置背景QPalette p = palette();p.setColor(QPalette::Window, Qt::white);setPalette(p);
}

参数设置函数实现

setShape、setPen、setBrush、setFillRule函数的实现

void DisplayArea::setShape(DisplayArea::Shape shape)
{this->shape = shape;update(); // 触发重绘
}void DisplayArea::setPen(QPen pen)
{this->pen = pen;update();
}void DisplayArea::setBrush(QBrush brush)
{this->brush = brush;update();
}void DisplayArea::setFillRule(Qt::FillRule fillRule)
{this->fillRule = fillRule;update();
}

重绘函数paintEvent实现

利用QPainter根据不同的设置在绘图显示区绘制图形。

这里绘制时使用事先设置的默认值进行绘制,注意QPainterPath的使用方法,可参见Qt手册。

void DisplayArea::paintEvent(QPaintEvent *event)
{QPainter p(this); // 新建一个QPainter对象 注意指定parentp.setPen(pen); // 设置画笔p.setBrush(brush); // 设置画刷// 默认值static const QPoint point1(50,50);static const QPoint point2(400,400); // 这里固定了位置,根据实际需要可以通过设置修改static const QRect rect(50,50,400,400);static const QPoint points4[4] = {QPoint(50, 50),QPoint(400, 100),QPoint(450, 350),QPoint(100, 300)};static const QPoint points5[5] = {QPoint(50, 50),QPoint(400, 100),QPoint(450, 350),QPoint(100, 300),QPoint(200, 250)};int startAngle =  30*16; // 弧形 起始角 QPainter 中画弧形使用的角度值以 1/16度 为单位, 30*16 为 30度int spanAngle = 120*16; // 弧形 跨度角QPainterPath path;//addRect  将给定的矩形作为闭合的子路径添加到此路径。将该矩形作为一组顺时针的线添加。// 添加矩形后,绘制路径的当前位置在矩形的左上角。path.addRect(100, 100, 100, 100);// 将当前点移动到给定点,隐式开始一个新的子路径并关闭前一个path.moveTo(0, 0);// 使用 c1 和 c2 指定的控制点在当前位置和给定端点之间添加三次贝塞尔曲线。// 添加曲线后,当前位置更新为曲线的终点。// void QPainterPath::cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint)path.cubicTo(300, 0,  200, 200,  300, 300);path.cubicTo(0, 300,  200, 200,  0, 0);path.setFillRule(fillRule);switch(shape){ // 根据不同的图形选择进行绘制case Line:{ // 直线 drawLine()p.drawLine(point1,point2); // 有不同的实现break;}case Rect:{ // 长方形 drawRect()p.drawRect(rect);break;}case RoundedRect:{ // 圆角方形 drawRoundRect()p.drawRoundRect(rect);break;}case Ellipse:{ // 椭圆形 drawEllipse()p.drawEllipse(rect);break;}case Polygon:{ // 多边形 drawPolygon()p.drawPolygon(points4,4,fillRule);break;}case Polyline:{ // 多边线 drawPolyline()p.drawPolyline(points5,5);break;}case Points:{ // 点 drawPoints()p.drawPoints(points5,5);break;}case Arc:{ // 弧 drawArc()p.drawArc(rect,startAngle,spanAngle);break;}case Path:{ // 路径 drawPath(const QPainterPath &path)p.drawPath(path);break;}case Text:{ // 文字 drawTextp.drawText(rect,Qt::AlignCenter,tr("Hello World!"));break;}case PixMap: { // 图片 drawPixmapp.drawPixmap(50,50,QPixmap(":/shape.png"));break;}default:break;}
}

主选项区域实现

qpaintersimpleexample.h头文件

class QPainterSimpleExample : public QWidget
{Q_OBJECTpublic:QPainterSimpleExample(QWidget *parent = nullptr);~QPainterSimpleExample();
protected slots:void DisplayShape(int value); // 形状void DisplayPenColor(); // 画笔颜色void DisplayPenLineWidth(int value); // 画笔线宽void DisplayPenStyle(int value); // 画笔风格void DisplayPenCap(int value); // 画笔笔帽void DisplayPenJoin(int value); // 画笔连接点void DisplayFillStyle(int value); // 填充样式void DisplaySpreadStyle(int value); // 平铺效果void DisplayBrushColor(); // 画刷颜色void DisplayBrushStyle(int value); // 画刷风格
private:// 绘制显示区DisplayArea *displayArea;// 布局QGridLayout *optiAreaLayout; // 右侧选项区布局QHBoxLayout *mainLayout; // 主窗口顶层布局// 形状QLabel *shapeLabel;QComboBox *shapeComboBox;// 画笔颜色QLabel *penColorLabel;QFrame *penColorFrame;QPushButton *penColorBtn;// 画笔线宽QLabel *penLineWidthLabel;QSpinBox *penLineWidthSpinBox;// 画笔风格QLabel *penStyleLabel;QComboBox *penStyleComboBox;// 画笔笔帽QLabel *penCapLabel;QComboBox *penCapComboBox;// 画笔连接点QLabel *penJoinLabel;QComboBox *penJoinComboBox;// 填充样式QLabel *fillStyleLabel;QComboBox *fillStyleComboBox;// 平铺效果QLabel *spreadStyleLabel;QComboBox *spreadStyleComboBox;// 画刷颜色QLabel *brushColorLabel;QFrame *brushColorFrame;QPushButton *brushColorBtn;// 画刷风格QLabel *brushStyleLabel;QComboBox *brushStyleComboBox;
};

构造函数

创建选项控件,设置布局,以及connect函数

QPainterSimpleExample::QPainterSimpleExample(QWidget *parent): QWidget(parent)
{// 绘制显示区displayArea = new DisplayArea;// 形状shapeLabel = new QLabel(tr("形状:"));shapeComboBox = new QComboBox;shapeComboBox->addItem(tr("Line 直线"), DisplayArea::Line);shapeComboBox->addItem(tr("Rect 长方形"), DisplayArea::Rect);shapeComboBox->addItem(tr("RoundedRect 圆角方形"), DisplayArea::RoundedRect);shapeComboBox->addItem(tr("Ellipse 椭圆形"), DisplayArea::Ellipse);shapeComboBox->addItem(tr("Polygon 多边形"), DisplayArea::Polygon);shapeComboBox->addItem(tr("Polyline 多边线"), DisplayArea::Polyline);shapeComboBox->addItem(tr("Points 点"), DisplayArea::Points);shapeComboBox->addItem(tr("Arc 弧"), DisplayArea::Arc);shapeComboBox->addItem(tr("Path 路径"), DisplayArea::Path);shapeComboBox->addItem(tr("Text 文字"), DisplayArea::Text);shapeComboBox->addItem(tr("PixMap 图片"), DisplayArea::PixMap);connect(shapeComboBox,SIGNAL(activated(int)),this,SLOT(DisplayShape(int)));// 画笔颜色penColorLabel = new QLabel(tr("画笔颜色:"));penColorFrame = new QFrame;penColorFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);penColorFrame->setAutoFillBackground(true);//可以改变背景色penColorFrame->setPalette(QPalette(Qt::blue));penColorBtn = new QPushButton(tr("修改"));connect(penColorBtn,SIGNAL(clicked()),this,SLOT(DisplayPenColor()));// 画笔线宽penLineWidthLabel = new QLabel(tr("画笔线宽:"));penLineWidthSpinBox = new QSpinBox;penLineWidthSpinBox->setRange(0,20);connect(penLineWidthSpinBox,SIGNAL(valueChanged(int)),this,SLOT(DisplayPenLineWidth(int)));// 画笔风格penStyleLabel = new QLabel(tr("画笔风格:"));penStyleComboBox = new QComboBox;penStyleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine));penStyleComboBox->addItem(tr("DashLine"),static_cast<int>(Qt::DashLine));penStyleComboBox->addItem(tr("DotLine"),static_cast<int>(Qt::DotLine));penStyleComboBox->addItem(tr("DashDotLine"),static_cast<int>(Qt::DashDotLine));penStyleComboBox->addItem(tr("DashDotDotLine"),static_cast<int>(Qt::DashDotDotLine));penStyleComboBox->addItem(tr("CustomDashLine"),static_cast<int>(Qt::CustomDashLine));connect(penStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplayPenStyle(int)));// 画笔笔帽penCapLabel = new QLabel(tr("画笔笔帽:"));penCapComboBox = new QComboBox;penCapComboBox->addItem(tr("FlatCap"),static_cast<int>(Qt::FlatCap));penCapComboBox->addItem(tr("SquareCap"),static_cast<int>(Qt::SquareCap));penCapComboBox->addItem(tr("RoundCap"),static_cast<int>(Qt::RoundCap));connect(penCapComboBox,SIGNAL(activated(int)),this,SLOT(DisplayPenCap(int)));// 画笔连接点penJoinLabel = new QLabel(tr("画笔连接点:"));penJoinComboBox = new QComboBox;penJoinComboBox->addItem(tr("MiterJoin"),static_cast<int>(Qt::MiterJoin));penJoinComboBox->addItem(tr("BevelJoin"),static_cast<int>(Qt::BevelJoin));penJoinComboBox->addItem(tr("RoundJoin"),static_cast<int>(Qt::RoundJoin));connect(penJoinComboBox,SIGNAL(activated(int)),this,SLOT(DisplayPenJoin(int)));// 填充样式fillStyleLabel = new QLabel(tr("填充样式:"));fillStyleComboBox = new QComboBox;fillStyleComboBox->addItem(tr("OddEvenMode"),static_cast<int>(QPaintEngine::OddEvenMode));fillStyleComboBox->addItem(tr("WindingMode"),static_cast<int>(QPaintEngine::WindingMode));connect(fillStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplayFillStyle(int)));// 铺展效果spreadStyleLabel = new QLabel(tr("铺展效果:"));spreadStyleComboBox = new QComboBox;spreadStyleComboBox->addItem(tr("PadSpread"),static_cast<int>(QGradient::PadSpread));spreadStyleComboBox->addItem(tr("RepeatSpread"),static_cast<int>(QGradient::RepeatSpread));spreadStyleComboBox->addItem(tr("ReflectSpread"),static_cast<int>(QGradient::ReflectSpread));connect(spreadStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplaySpreadStyle(int)));// 画刷颜色brushColorLabel = new QLabel(tr("画刷颜色:"));brushColorFrame = new QFrame;brushColorFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);brushColorFrame->setAutoFillBackground(true);//可以改变背景色brushColorFrame->setPalette(QPalette(Qt::yellow));brushColorBtn = new QPushButton(tr("修改"));connect(brushColorBtn,SIGNAL(clicked()),this,SLOT(DisplayBrushColor()));// 画刷风格brushStyleLabel = new QLabel(tr("画刷风格:"));brushStyleComboBox = new QComboBox;brushStyleComboBox->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern));brushStyleComboBox->addItem(tr("Dense1Pattern"),static_cast<int>(Qt::Dense1Pattern));brushStyleComboBox->addItem(tr("Dense2Pattern"),static_cast<int>(Qt::Dense2Pattern));brushStyleComboBox->addItem(tr("Dense3Pattern"),static_cast<int>(Qt::Dense3Pattern));brushStyleComboBox->addItem(tr("Dense4Pattern"),static_cast<int>(Qt::Dense4Pattern));brushStyleComboBox->addItem(tr("Dense5Pattern"),static_cast<int>(Qt::Dense5Pattern));brushStyleComboBox->addItem(tr("Dense6Pattern"),static_cast<int>(Qt::Dense6Pattern));brushStyleComboBox->addItem(tr("Dense7Pattern"),static_cast<int>(Qt::Dense7Pattern));brushStyleComboBox->addItem(tr("HorPattern"),static_cast<int>(Qt::HorPattern));brushStyleComboBox->addItem(tr("VerPattern"),static_cast<int>(Qt::VerPattern));brushStyleComboBox->addItem(tr("CrossPattern"),static_cast<int>(Qt::CrossPattern));brushStyleComboBox->addItem(tr("BDiagPattern"),static_cast<int>(Qt::BDiagPattern));brushStyleComboBox->addItem(tr("FDiagPattern"),static_cast<int>(Qt::FDiagPattern));brushStyleComboBox->addItem(tr("DiagCrossPattern"),static_cast<int>(Qt::DiagCrossPattern));brushStyleComboBox->addItem(tr("LinearGradientPattern"),static_cast<int>(Qt::LinearGradientPattern));brushStyleComboBox->addItem(tr("ConicalGradientPattern"),static_cast<int>(Qt::ConicalGradientPattern));brushStyleComboBox->addItem(tr("RadialGradientPattern"),static_cast<int>(Qt::RadialGradientPattern));brushStyleComboBox->addItem(tr("TexturePattern"),static_cast<int>(Qt::TexturePattern));connect(brushStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplayBrushStyle(int)));// 布局optiAreaLayout = new QGridLayout;mainLayout = new QHBoxLayout(this); // 注意指定parent// 形状optiAreaLayout->addWidget(shapeLabel,0,0);optiAreaLayout->addWidget(shapeComboBox,0,1);// 画笔颜色optiAreaLayout->addWidget(penColorLabel,1,0);optiAreaLayout->addWidget(penColorFrame,1,1);optiAreaLayout->addWidget(penColorBtn,1,2);// 画笔线宽optiAreaLayout->addWidget(penLineWidthLabel,2,0);optiAreaLayout->addWidget(penLineWidthSpinBox,2,1);// 画笔风格optiAreaLayout->addWidget(penStyleLabel,3,0);optiAreaLayout->addWidget(penStyleComboBox,3,1);// 画笔笔帽optiAreaLayout->addWidget(penCapLabel,4,0);optiAreaLayout->addWidget(penCapComboBox,4,1);// 画笔连接点optiAreaLayout->addWidget(penJoinLabel,5,0);optiAreaLayout->addWidget(penJoinComboBox,5,1);// 填充样式optiAreaLayout->addWidget(fillStyleLabel,6,0);optiAreaLayout->addWidget(fillStyleComboBox,6,1);// 铺展效果optiAreaLayout->addWidget(spreadStyleLabel,7,0);optiAreaLayout->addWidget(spreadStyleComboBox,7,1);// 画刷颜色optiAreaLayout->addWidget(brushColorLabel,8,0);optiAreaLayout->addWidget(brushColorFrame,8,1);optiAreaLayout->addWidget(brushColorBtn,8,2);// 画刷风格optiAreaLayout->addWidget(brushStyleLabel,9,0);optiAreaLayout->addWidget(brushStyleComboBox,9,1);mainLayout->addWidget(displayArea);mainLayout->addLayout(optiAreaLayout);mainLayout->setStretchFactor(displayArea,1);mainLayout->setStretchFactor(optiAreaLayout,1);
}

图形设置并显示DisplayShape函数

void QPainterSimpleExample::DisplayShape(int value)
{DisplayArea::Shape shape = DisplayArea::Shape(shapeComboBox->itemData(value,Qt::UserRole).toInt());displayArea->setShape(shape);
}

QComboBoxitemData方法返回当前显示的下拉列表框数据,是一个QVariant对象,此对象与控件初始化时插入的类型有关

画笔颜色设置并显示DisplayPenColor函数

利用标准颜色对话框QColorDialog获取选取的颜色参见QT基础之基本对话框,通过QFrame的背景色显示所选颜色

void QPainterSimpleExample::DisplayPenColor()
{// 画笔颜色QColor color = QColorDialog::getColor(Qt::blue);penColorFrame->setPalette(QPalette(color));// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}

画笔线宽设置并显示DisplayPenLineWidth函数

void QPainterSimpleExample::DisplayPenLineWidth(int value)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽 就是 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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}

画笔风格设置并显示DisplayPenStyle函数

void QPainterSimpleExample::DisplayPenStyle(int penStyleValue)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}

画笔风格简介

更多参见QT手册

画笔笔帽设置并显示DisplayPenCap函数

// 画笔笔帽
void QPainterSimpleExample::DisplayPenCap(int penCapValue)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}

画笔笔帽简介

更多参见QT手册

画笔连接点设置并显示DisplayPenJoin函数

void QPainterSimpleExample::DisplayPenJoin(int penJoinValue)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}

画笔连接点简介

更多参见QT手册

填充样式设置并显示DisplayFillStyle函数

void QPainterSimpleExample::DisplayFillStyle(int value)
{Qt::FillRule fillRule = Qt::FillRule(fillStyleComboBox->itemData(fillStyleComboBox->currentIndex(),Qt::UserRole).toInt());// 设置填充样式displayArea->setFillRule(fillRule);
}

填充样式简介

铺展样式设置DisplaySpreadStyle函数

void QPainterSimpleExample::DisplaySpreadStyle(int value)
{QGradient::Spread spread = QGradient::Spread(spreadStyleComboBox->itemData(spreadStyleComboBox->currentIndex(),Qt::UserRole).toInt());this->spread = spread;
}

铺展样式简介

画刷颜色设置并显示DisplayBrushColor函数

void QPainterSimpleExample::DisplayBrushColor()
{// 画刷颜色QColor color = QColorDialog::getColor(Qt::yellow);brushColorFrame->setPalette(QPalette(color));DisplayBrushStyle(brushStyleComboBox->currentIndex());
}

画刷风格设置并显示DisplayBrushStyle函数

渐变效果设置并显示

铺展效果显示

// 画刷风格
void QPainterSimpleExample::DisplayBrushStyle(int value)
{//获得画刷的颜色QColor color = brushColorFrame->palette().color(QPalette:: Window);Qt::BrushStyle style = Qt::BrushStyle(brushStyleComboBox-> itemData(value,Qt::UserRole).toInt());if(style == Qt::LinearGradientPattern) { // 线性渐变QLinearGradient linearGradient(0,0,500,500);linearGradient.setColorAt(0.0,Qt::white);linearGradient.setColorAt(0.2,color);linearGradient.setColorAt(1.0,Qt::black);linearGradient.setSpread(spread);displayArea->setBrush(linearGradient);} else if(style == Qt::RadialGradientPattern) { // 圆形渐变QRadialGradient radialGradient(250,250,200,0,500);// 圆心 半径 焦点值radialGradient.setColorAt(0.0,Qt::white);radialGradient.setColorAt(0.2,color);radialGradient.setColorAt(1.0,Qt::black);radialGradient.setSpread(spread);displayArea->setBrush(radialGradient);} else if(style == Qt::ConicalGradientPattern) { // 锥形渐变QConicalGradient conicalGradient(200,200,30); // 顶点 夹角conicalGradient.setColorAt(0.0,Qt::white);conicalGradient.setColorAt(0.2,color);conicalGradient.setColorAt(1.0,Qt::black);displayArea->setBrush(conicalGradient);} else if(style == Qt::TexturePattern) { // 图片displayArea->setBrush(QBrush(QPixmap(":/texture.png")));} else {displayArea->setBrush(QBrush(color,style));}
}

画刷风格简介

qpaintersimpleexample.cpp文件

主选项区域实现代码汇总

QPainterSimpleExample::QPainterSimpleExample(QWidget *parent): QWidget(parent)
{// 绘制显示区displayArea = new DisplayArea;// 形状shapeLabel = new QLabel(tr("形状:"));shapeComboBox = new QComboBox;shapeComboBox->addItem(tr("Line 直线"), DisplayArea::Line);shapeComboBox->addItem(tr("Rect 长方形"), DisplayArea::Rect);shapeComboBox->addItem(tr("RoundedRect 圆角方形"), DisplayArea::RoundedRect);shapeComboBox->addItem(tr("Ellipse 椭圆形"), DisplayArea::Ellipse);shapeComboBox->addItem(tr("Polygon 多边形"), DisplayArea::Polygon);shapeComboBox->addItem(tr("Polyline 多边线"), DisplayArea::Polyline);shapeComboBox->addItem(tr("Points 点"), DisplayArea::Points);shapeComboBox->addItem(tr("Arc 弧"), DisplayArea::Arc);shapeComboBox->addItem(tr("Path 路径"), DisplayArea::Path);shapeComboBox->addItem(tr("Text 文字"), DisplayArea::Text);shapeComboBox->addItem(tr("PixMap 图片"), DisplayArea::PixMap);connect(shapeComboBox,SIGNAL(activated(int)),this,SLOT(DisplayShape(int)));// 画笔颜色penColorLabel = new QLabel(tr("画笔颜色:"));penColorFrame = new QFrame;penColorFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);penColorFrame->setAutoFillBackground(true);//可以改变背景色penColorFrame->setPalette(QPalette(Qt::blue));penColorBtn = new QPushButton(tr("修改"));connect(penColorBtn,SIGNAL(clicked()),this,SLOT(DisplayPenColor()));// 画笔线宽penLineWidthLabel = new QLabel(tr("画笔线宽:"));penLineWidthSpinBox = new QSpinBox;penLineWidthSpinBox->setRange(0,20);connect(penLineWidthSpinBox,SIGNAL(valueChanged(int)),this,SLOT(DisplayPenLineWidth(int)));// 画笔风格penStyleLabel = new QLabel(tr("画笔风格:"));penStyleComboBox = new QComboBox;penStyleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine));penStyleComboBox->addItem(tr("DashLine"),static_cast<int>(Qt::DashLine));penStyleComboBox->addItem(tr("DotLine"),static_cast<int>(Qt::DotLine));penStyleComboBox->addItem(tr("DashDotLine"),static_cast<int>(Qt::DashDotLine));penStyleComboBox->addItem(tr("DashDotDotLine"),static_cast<int>(Qt::DashDotDotLine));penStyleComboBox->addItem(tr("CustomDashLine"),static_cast<int>(Qt::CustomDashLine));connect(penStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplayPenStyle(int)));// 画笔笔帽penCapLabel = new QLabel(tr("画笔笔帽:"));penCapComboBox = new QComboBox;penCapComboBox->addItem(tr("FlatCap"),static_cast<int>(Qt::FlatCap));penCapComboBox->addItem(tr("SquareCap"),static_cast<int>(Qt::SquareCap));penCapComboBox->addItem(tr("RoundCap"),static_cast<int>(Qt::RoundCap));connect(penCapComboBox,SIGNAL(activated(int)),this,SLOT(DisplayPenCap(int)));// 画笔连接点penJoinLabel = new QLabel(tr("画笔连接点:"));penJoinComboBox = new QComboBox;penJoinComboBox->addItem(tr("MiterJoin"),static_cast<int>(Qt::MiterJoin));penJoinComboBox->addItem(tr("BevelJoin"),static_cast<int>(Qt::BevelJoin));penJoinComboBox->addItem(tr("RoundJoin"),static_cast<int>(Qt::RoundJoin));connect(penJoinComboBox,SIGNAL(activated(int)),this,SLOT(DisplayPenJoin(int)));// 填充样式fillStyleLabel = new QLabel(tr("填充样式:"));fillStyleComboBox = new QComboBox;fillStyleComboBox->addItem(tr("OddEvenMode"),static_cast<int>(QPaintEngine::OddEvenMode));fillStyleComboBox->addItem(tr("WindingMode"),static_cast<int>(QPaintEngine::WindingMode));connect(fillStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplayFillStyle(int)));// 铺展效果spreadStyleLabel = new QLabel(tr("铺展效果:"));spreadStyleComboBox = new QComboBox;spreadStyleComboBox->addItem(tr("PadSpread"),static_cast<int>(QGradient::PadSpread));spreadStyleComboBox->addItem(tr("RepeatSpread"),static_cast<int>(QGradient::RepeatSpread));spreadStyleComboBox->addItem(tr("ReflectSpread"),static_cast<int>(QGradient::ReflectSpread));connect(spreadStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplaySpreadStyle(int)));// 画刷颜色brushColorLabel = new QLabel(tr("画刷颜色:"));brushColorFrame = new QFrame;brushColorFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);brushColorFrame->setAutoFillBackground(true);//可以改变背景色brushColorFrame->setPalette(QPalette(Qt::yellow));brushColorBtn = new QPushButton(tr("修改"));connect(brushColorBtn,SIGNAL(clicked()),this,SLOT(DisplayBrushColor()));// 画刷风格brushStyleLabel = new QLabel(tr("画刷风格:"));brushStyleComboBox = new QComboBox;brushStyleComboBox->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern));brushStyleComboBox->addItem(tr("Dense1Pattern"),static_cast<int>(Qt::Dense1Pattern));brushStyleComboBox->addItem(tr("Dense2Pattern"),static_cast<int>(Qt::Dense2Pattern));brushStyleComboBox->addItem(tr("Dense3Pattern"),static_cast<int>(Qt::Dense3Pattern));brushStyleComboBox->addItem(tr("Dense4Pattern"),static_cast<int>(Qt::Dense4Pattern));brushStyleComboBox->addItem(tr("Dense5Pattern"),static_cast<int>(Qt::Dense5Pattern));brushStyleComboBox->addItem(tr("Dense6Pattern"),static_cast<int>(Qt::Dense6Pattern));brushStyleComboBox->addItem(tr("Dense7Pattern"),static_cast<int>(Qt::Dense7Pattern));brushStyleComboBox->addItem(tr("HorPattern"),static_cast<int>(Qt::HorPattern));brushStyleComboBox->addItem(tr("VerPattern"),static_cast<int>(Qt::VerPattern));brushStyleComboBox->addItem(tr("CrossPattern"),static_cast<int>(Qt::CrossPattern));brushStyleComboBox->addItem(tr("BDiagPattern"),static_cast<int>(Qt::BDiagPattern));brushStyleComboBox->addItem(tr("FDiagPattern"),static_cast<int>(Qt::FDiagPattern));brushStyleComboBox->addItem(tr("DiagCrossPattern"),static_cast<int>(Qt::DiagCrossPattern));brushStyleComboBox->addItem(tr("LinearGradientPattern"),static_cast<int>(Qt::LinearGradientPattern));brushStyleComboBox->addItem(tr("ConicalGradientPattern"),static_cast<int>(Qt::ConicalGradientPattern));brushStyleComboBox->addItem(tr("RadialGradientPattern"),static_cast<int>(Qt::RadialGradientPattern));brushStyleComboBox->addItem(tr("TexturePattern"),static_cast<int>(Qt::TexturePattern));connect(brushStyleComboBox,SIGNAL(activated(int)),this,SLOT(DisplayBrushStyle(int)));// 布局optiAreaLayout = new QGridLayout;mainLayout = new QHBoxLayout(this); // 注意指定parent// 形状optiAreaLayout->addWidget(shapeLabel,0,0);optiAreaLayout->addWidget(shapeComboBox,0,1);// 画笔颜色optiAreaLayout->addWidget(penColorLabel,1,0);optiAreaLayout->addWidget(penColorFrame,1,1);optiAreaLayout->addWidget(penColorBtn,1,2);// 画笔线宽optiAreaLayout->addWidget(penLineWidthLabel,2,0);optiAreaLayout->addWidget(penLineWidthSpinBox,2,1);// 画笔风格optiAreaLayout->addWidget(penStyleLabel,3,0);optiAreaLayout->addWidget(penStyleComboBox,3,1);// 画笔笔帽optiAreaLayout->addWidget(penCapLabel,4,0);optiAreaLayout->addWidget(penCapComboBox,4,1);// 画笔连接点optiAreaLayout->addWidget(penJoinLabel,5,0);optiAreaLayout->addWidget(penJoinComboBox,5,1);// 填充样式optiAreaLayout->addWidget(fillStyleLabel,6,0);optiAreaLayout->addWidget(fillStyleComboBox,6,1);// 铺展效果optiAreaLayout->addWidget(spreadStyleLabel,7,0);optiAreaLayout->addWidget(spreadStyleComboBox,7,1);// 画刷颜色optiAreaLayout->addWidget(brushColorLabel,8,0);optiAreaLayout->addWidget(brushColorFrame,8,1);optiAreaLayout->addWidget(brushColorBtn,8,2);// 画刷风格optiAreaLayout->addWidget(brushStyleLabel,9,0);optiAreaLayout->addWidget(brushStyleComboBox,9,1);mainLayout->addWidget(displayArea);mainLayout->addLayout(optiAreaLayout);mainLayout->setStretchFactor(displayArea,1);mainLayout->setStretchFactor(optiAreaLayout,1);
}QPainterSimpleExample::~QPainterSimpleExample()
{}
// 形状
void QPainterSimpleExample::DisplayShape(int value)
{DisplayArea::Shape shape = DisplayArea::Shape(shapeComboBox->itemData(value,Qt::UserRole).toInt());displayArea->setShape(shape);
}
// 画笔颜色
void QPainterSimpleExample::DisplayPenColor()
{// 画笔颜色QColor color = QColorDialog::getColor(Qt::blue);penColorFrame->setPalette(QPalette(color));// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}
// 画笔线宽
void QPainterSimpleExample::DisplayPenLineWidth(int value)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽 就是 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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}
// 画笔风格
void QPainterSimpleExample::DisplayPenStyle(int penStyleValue)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}// 画笔笔帽
void QPainterSimpleExample::DisplayPenCap(int penCapValue)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}
// 画笔连接点
void QPainterSimpleExample::DisplayPenJoin(int penJoinValue)
{// 画笔颜色QColor color = penColorFrame->palette().color(QPalette::Window); // 获取penColorFrame 背景色// 画笔线宽int value = penLineWidthSpinBox->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());// 设置画笔displayArea->setPen(QPen(color,value,style,cap,join));
}
// 填充样式
void QPainterSimpleExample::DisplayFillStyle(int value)
{Qt::FillRule fillRule = Qt::FillRule(fillStyleComboBox->itemData(fillStyleComboBox->currentIndex(),Qt::UserRole).toInt());// 设置填充样式displayArea->setFillRule(fillRule);
}
// 铺展效果
void QPainterSimpleExample::DisplaySpreadStyle(int value)
{QGradient::Spread spread = QGradient::Spread(spreadStyleComboBox->itemData(spreadStyleComboBox->currentIndex(),Qt::UserRole).toInt());this->spread = spread;
}
// 画刷颜色
void QPainterSimpleExample::DisplayBrushColor()
{// 画刷颜色QColor color = QColorDialog::getColor(Qt::yellow);brushColorFrame->setPalette(QPalette(color));DisplayBrushStyle(brushStyleComboBox->currentIndex());
}
// 画刷风格
void QPainterSimpleExample::DisplayBrushStyle(int value)
{//获得画刷的颜色QColor color = brushColorFrame->palette().color(QPalette:: Window);Qt::BrushStyle style = Qt::BrushStyle(brushStyleComboBox-> itemData(value,Qt::UserRole).toInt());if(style == Qt::LinearGradientPattern) { // 线性渐变QLinearGradient linearGradient(0,0,500,500);linearGradient.setColorAt(0.0,Qt::white);linearGradient.setColorAt(0.2,color);linearGradient.setColorAt(1.0,Qt::black);linearGradient.setSpread(spread);displayArea->setBrush(linearGradient);} else if(style == Qt::RadialGradientPattern) { // 圆形渐变QRadialGradient radialGradient(250,250,200,0,500);// 圆心 半径 焦点值radialGradient.setColorAt(0.0,Qt::white);radialGradient.setColorAt(0.2,color);radialGradient.setColorAt(1.0,Qt::black);radialGradient.setSpread(spread);displayArea->setBrush(radialGradient);} else if(style == Qt::ConicalGradientPattern) { // 锥形渐变QConicalGradient conicalGradient(200,200,30); // 顶点 夹角conicalGradient.setColorAt(0.0,Qt::white);conicalGradient.setColorAt(0.2,color);conicalGradient.setColorAt(1.0,Qt::black);displayArea->setBrush(conicalGradient);} else if(style == Qt::TexturePattern) { // 图片displayArea->setBrush(QBrush(QPixmap(":/texture.png")));} else {displayArea->setBrush(QBrush(color,style));}
}

希望我的文章对于大家有帮助,由于个人能力的局限性,文中可能存在一些问题,欢迎指正、补充!

QT基础之一文介绍QPainter绘制基础图形(画笔画刷设置,填充铺展渐变效果)相关推荐

  1. PyQt5利用QPainter绘制各种图形

    这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...

  2. Windows 编程,画笔画刷以及几何图形的绘制

    Windows编程,画笔画刷的介绍 画笔,可以用以下代码新建一个画笔对象: HPEN hpen = CreatePen(PS_SOLID, 1, RGB(255,0,0)); 可以看到,画笔的Crea ...

  3. Qt:QPainter重写mainwindows绘图事件绘制直线,弧线、设置画笔画刷

    //光标定位到QPainter类名上,然后按下键盘上的F1按键,这时会自动跳转到该类的帮助页面 1.新建Qt Gui应用,名为MainWindow,基类为QMainWindow. 2.修改mainwi ...

  4. 用计算机如何编辑文档,怎么用word画图-这里教你如何编辑在word文档中绘制的图形...

    在上次文章的介绍中,还没有介绍完如何编辑图形,所以现在给大家补充完. 1.如何为图形添加文字 在上篇文章中,我已经教给大家如何绘制图形了,但是如何在图形中添加文字使其变的更美观呢!首先,我们还是按照绘 ...

  5. Qpointer画笔画刷等详细介绍

    以下内容转载自豆子老师博客. 多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写了一下.今天带来的是新的部分,有关Qt的 ...

  6. 大一计算机基础excel文档,大一计算机应用基础办公自动化软件深入Excel复习用PPT课件.ppt...

    2020 3 18 Excel电子表格基本操作 计算机应用基础08版 第2章2 3节 1 2020 3 18 数据处理 1 数据处理的基本概念2 数据处理的常用软件电子表格类 Excel Lotus1 ...

  7. [网络基础]网络设备简单介绍(网络基础知识)

    1 中继器 中继器(repeater)是位于第一层(物理层)的网络设备. 随着经过的线缆越来越长,信号会变得越来越弱.中继器的目的是在比特级别对网络信号进行再生和重定时.从而使得他们能够在网络上传输更 ...

  8. IOS 绘制基本图形(画文字、图片水印)

    - (void)drawRect:(CGRect)rect {// Drawing code// [self test]; // 1.加载图片到内存中UIImage *image = [UIImage ...

  9. android 实现绘制不规则图形,Android贝塞尔曲线实现填充不规则图形并随手指运动...

    贝塞尔曲线: 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由 Paul de Casteljau 于 1959 年运用 de Ca ...

最新文章

  1. MATLAB画图:改变坐标轴刻度的显示数值
  2. iOS 汉字转拼音 PinYin4Objc
  3. 怎样实现关闭connection时自动关闭Statement和ResultSet
  4. Python使用request包请求网页乱码解决方法
  5. ajaxfileupload带参数上传文件
  6. LVS负载均衡DR模式实现
  7. R语言tseries包
  8. AC自动机:例题与机制详解
  9. InfluxDB(官方使用说明)
  10. 收藏 | 让你纵横 GitHub 的五大神器
  11. 2019西安交通大学计算机复试,2019年西安交通大学复试分数线
  12. envi反演水质参数_基于大气校正法的Landsat 8 TIRS地表温度反演
  13. codeforces 27 E. Number With The Given Amount Of Divisors(数论+dfs)
  14. 【转载】Linux GCC常用命令
  15. 十个实用的谷歌搜索小技巧
  16. 学习日记day36 平面设计 字体设计
  17. 一款网页游戏外挂开发-数据抓包
  18. 网站统计中访客标识码有什么作用
  19. 五种蓝牙耳机,到底谁才是你的菜
  20. Marshal Lion扩大到中国

热门文章

  1. 基于Python的人脸识别 附带说明文档
  2. hbuilder背景图片
  3. html5蚂蚁森林种树效果,在蚂蚁森林“种树”2年,5500万棵树苗,真的变身“森林”了吗?...
  4. 客服机器人的出现敲响客服人警钟
  5. 平面印刷品画册的使用规范
  6. a10 amd 安装黑苹果_AMD PRO A10-8770 R7安装黑苹果—花屏禁止安装
  7. 小程序 纯js模拟烟花特效
  8. mysql 枚举 enum用法_mysql中的枚举类型ENUM的用法:
  9. 计算机网络(就业向总复习)
  10. 基于Java Web的共享充电宝管理系统