赞
踩
**注意:**QPainter画弧度所使用的角度值,是以1/16°为单位的,在画弧度的时候1°用16表示。
**例如:**30°——30 x 16
兼容模式QPainer::CompositionMode
**例如:**可用于图片叠加,达到你想要的效果。
QPainterPath为QPainter类提供一个存储容器,里面包含了所要绘制的内容的集合及绘制顺序,如长方形、多边形、曲线等各种任意图形。当需要绘制此预先存储在QPainterPath对象中的内容时,只需调用QPainter类的DrawPath()即可,如addRect()加入一个方形,addEllipse加入一个椭圆形,addText()加入文本。
画笔风格——Qt::PenStyle
笔帽风格——Qt::PenCapStyle
Qt::SquareCap 方形线端,不覆盖线的端点
Qt::FlatCap 方形线端,覆盖线的端点,并以线框一半向外延伸
Qt::RoundCap 圆线端
连接点——Qt::PenJoinStyle
Qt::BevelJoin 两条线相汇形成方形连接
Qt::MiterJoin 两条线相汇形成尖角连接
Qt::RoundJoin两条线相汇形成圆角连接
填充模式——Qt::FillRule
铺展效果——Qt::Gradient::Type
QGradient::PadSpread :默认风格
QGradient::RepeatSpread:线性渐变
QGradient::ReflectSpread:圆形渐变
画刷风格——Qt::BrushStyle
mainwidget.h
#ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include<paintarea.h> #include<QLabel> #include<QComboBox> #include<QSpinBox> #include<QPushButton> #include<QGridLayout> class MainWidget : public QWidget { Q_OBJECT public: MainWidget(QWidget *parent = 0); ~MainWidget(); void initWidgets(); private slots: void ShowShape(int value); void ShowPenColor(); void ShowPenWidth(int value); void ShowPenStyle(int value); void ShowPenCap(int value); void ShowPenJoin(int value); void ShowFillRule(int value); void ShowSpreadStyle(int value); void ShowBrushColor(); void ShowBrush(int value); private: PaintArea* m_paintArea; //绘图区域 QLabel* m_shapeLabel ; //形状 QComboBox* m_shapeCombox; QLabel* m_penWidthLabel;//线宽 QSpinBox *m_penWithSpinBox; QLabel* m_penColorLabel;//画笔颜色 QFrame* m_penColorFrame; QPushButton* m_penColorBtn;//确认选择画笔颜色按钮 QLabel* m_penStyleLabel;//画笔风格 QComboBox* m_penStyleComboBox; QLabel* m_penCapLabel;//笔帽风格 QComboBox* m_penCapComboBox; QLabel* m_penJoinLabel;//画笔连接点 QComboBox* m_penJoinComboBox; QLabel* m_fillRuleLabel;//填充模式 QComboBox* m_fillRuleComboBox; QLabel* m_spreadLabel;//铺展效果 QComboBox* m_spreadComboBox; QGradient::Spread m_spread; QLabel* m_brushColorLabel;//画刷颜色 QFrame* m_brushColorFrame; QPushButton* m_brushColorBtn; QLabel* m_brushStyleLabel;//画刷风格 QComboBox* m_brushStytleComboBox; QGridLayout* m_rightLayout; }; #endif // MAINWIDGET_H
mainwidget.cpp
#include "mainwidget.h" #include<QColorDialog> MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { initWidgets(); } MainWidget::~MainWidget() { } //初始化部件 void MainWidget::initWidgets() { m_paintArea = new PaintArea; m_shapeLabel = new QLabel(tr("形状")); m_shapeCombox = new QComboBox; m_shapeCombox->addItem(tr("Line"),PaintArea::Line); m_shapeCombox->addItem(tr("Rectangle"),PaintArea::Rectangle); m_shapeCombox->addItem(tr("RoundedRect"),PaintArea::Rectangle); m_shapeCombox->addItem(tr("Ellipse"),PaintArea::Ellipse); m_shapeCombox->addItem(tr("Polygon"),PaintArea::Polygon); m_shapeCombox->addItem(tr("Polyline"),PaintArea::Polyline); m_shapeCombox->addItem(tr("Points"),PaintArea::Points); m_shapeCombox->addItem(tr("Arc"),PaintArea::Arc); m_shapeCombox->addItem(tr("Path"),PaintArea::Path); m_shapeCombox->addItem(tr("Text"),PaintArea::Text); m_shapeCombox->addItem(tr("Pixmap"),PaintArea::Pixmap); connect(m_shapeCombox,SIGNAL(activated(int)),this,SLOT(ShowShape(int))); m_penColorLabel = new QLabel(tr("画笔颜色")); m_penColorFrame = new QFrame; m_penColorFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken);//设置风格 m_penColorFrame->setAutoFillBackground(true); m_penColorFrame->setPalette(QPalette(Qt::black)); m_penColorBtn = new QPushButton(tr("更改")); connect(m_penColorBtn,SIGNAL(clicked(bool)),this,SLOT(ShowPenColor())); m_penWidthLabel = new QLabel(tr("画线宽度")); m_penWithSpinBox = new QSpinBox; m_penWithSpinBox->setRange(1,20); connect(m_penWithSpinBox,SIGNAL( valueChanged(int)),SLOT(ShowPenWidth(int))); m_penStyleLabel = new QLabel(tr("画笔风格")); m_penStyleComboBox = new QComboBox; m_penStyleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine )); m_penStyleComboBox->addItem(tr("DashLine"),static_cast<int>(Qt::DashLine)); m_penStyleComboBox->addItem(tr("DotLine"),static_cast<int>(Qt::DotLine)); m_penStyleComboBox->addItem(tr("DashDotLine"),static_cast<int>(Qt::DashDotLine )); m_penStyleComboBox->addItem(tr("DashDotDotLine"),static_cast<int>(Qt::DashDotDotLine )); m_penStyleComboBox->addItem(tr("CustomDashLine"),static_cast<int>(Qt::CustomDashLine)); connect(m_penStyleComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenStyle(int))); m_penCapLabel = new QLabel(tr("画笔笔帽")); m_penCapComboBox = new QComboBox; m_penCapComboBox->addItem(tr("SquareCap"),Qt::SquareCap); m_penCapComboBox->addItem(tr("FlatCap"),Qt::FlatCap); m_penCapComboBox->addItem(tr("RoundCap"),Qt::RoundCap); connect(m_penCapComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenCap(int))); m_penJoinLabel = new QLabel(tr("画笔连接点")); m_penJoinComboBox = new QComboBox; m_penJoinComboBox->addItem(tr("BevelJoin"),Qt::BevelJoin); m_penJoinComboBox->addItem(tr("MiterJoin"),Qt::MiterJoin); m_penJoinComboBox->addItem(tr("RoundJoin"),Qt::RoundJoin); connect(m_penJoinComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenJoin(int))); m_fillRuleLabel = new QLabel(tr("填充模式")); m_fillRuleComboBox = new QComboBox; m_fillRuleComboBox->addItem(tr("Odd Even"),Qt::OddEvenFill); m_fillRuleComboBox->addItem(tr("Winding"),Qt::WindingFill); connect(m_fillRuleComboBox,SIGNAL(activated(int)),this,SLOT(ShowFillRule(int))); m_spreadLabel = new QLabel(tr("铺展效果")); m_spreadComboBox = new QComboBox; m_spreadComboBox->addItem(tr("PadStread"),QGradient::PadSpread); m_spreadComboBox->addItem(tr("RepeatSpread"),QGradient::RepeatSpread); m_spreadComboBox->addItem(tr("ReflectSpread"),QGradient::ReflectSpread); connect(m_spreadComboBox,SIGNAL(activated(int)),this,SLOT(ShowSpreadStyle(int))); m_brushColorLabel = new QLabel(tr("画刷颜色")); m_brushColorFrame = new QFrame; m_brushColorFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); m_brushColorFrame->setAutoFillBackground(true); m_brushColorFrame->setPalette(QPalette(Qt::green)); m_brushColorBtn = new QPushButton(tr("更改")); connect(m_brushColorBtn,SIGNAL(clicked()),this,SLOT(ShowBrushColor()) ); m_brushStyleLabel = new QLabel(tr("画刷风格")); m_brushStytleComboBox = new QComboBox; m_brushStytleComboBox->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern)); m_brushStytleComboBox->addItem(tr("Dense1Pattern"),static_cast<int>(Qt::Dense1Pattern)); m_brushStytleComboBox->addItem(tr("Dense2Pattern"),static_cast<int>(Qt::Dense2Pattern)); m_brushStytleComboBox->addItem(tr("Dense3Pattern"),static_cast<int>(Qt::Dense3Pattern)); m_brushStytleComboBox->addItem(tr("Dense4Pattern"),static_cast<int>(Qt::Dense4Pattern)); m_brushStytleComboBox->addItem(tr("Dense5Pattern"),static_cast<int>(Qt::Dense5Pattern)); m_brushStytleComboBox->addItem(tr("Dense6Pattern"),static_cast<int>(Qt::Dense6Pattern)); m_brushStytleComboBox->addItem(tr("Dense7Pattern"),static_cast<int>(Qt::Dense7Pattern)); m_brushStytleComboBox->addItem(tr("HorPattern"),static_cast<int>(Qt::HorPattern)); m_brushStytleComboBox->addItem(tr("VerPattern"),static_cast<int>(Qt::VerPattern)); m_brushStytleComboBox->addItem(tr("CrossPattern"),static_cast<int>(Qt::CrossPattern)); m_brushStytleComboBox->addItem(tr("BDiagPattern"),static_cast<int>(Qt::BDiagPattern)); m_brushStytleComboBox->addItem(tr("FDiagPattern"),static_cast<int>(Qt::FDiagPattern)); m_brushStytleComboBox->addItem(tr("DiagCrossPattern"),static_cast<int>(Qt::DiagCrossPattern)); m_brushStytleComboBox->addItem(tr("LinearGradientPattern"),static_cast<int>(Qt::LinearGradientPattern)); m_brushStytleComboBox->addItem(tr("ConicalGradientPattern"),static_cast<int>(Qt::ConicalGradientPattern)); m_brushStytleComboBox->addItem(tr("RadialGradientPattern"),static_cast<int>(Qt::RadialGradientPattern)); m_brushStytleComboBox->addItem(tr("TexturePattern"),static_cast<int>(Qt::TexturePattern)); connect(m_brushStytleComboBox,SIGNAL(activated(int)),this,SLOT(ShowBrush(int))); //添加布局 m_rightLayout = new QGridLayout; m_rightLayout->addWidget(m_shapeLabel,0,0); m_rightLayout->addWidget(m_shapeCombox,0,1); m_rightLayout->addWidget(m_penColorLabel,1,0); m_rightLayout->addWidget(m_penColorFrame,1,1); m_rightLayout->addWidget(m_penColorBtn,1,2); m_rightLayout->addWidget(m_penWidthLabel,2,0); m_rightLayout->addWidget(m_penWithSpinBox,2,1); m_rightLayout->addWidget(m_penStyleLabel,3,0); m_rightLayout->addWidget(m_penStyleComboBox,3,1); m_rightLayout->addWidget(m_penCapLabel,4,0); m_rightLayout->addWidget(m_penCapComboBox,4,1); m_rightLayout->addWidget(m_penJoinLabel,5,0); m_rightLayout->addWidget(m_penJoinComboBox,5,1); m_rightLayout->addWidget(m_fillRuleLabel,6,0); m_rightLayout->addWidget(m_fillRuleComboBox,6,1); m_rightLayout->addWidget(m_spreadLabel,7,0); m_rightLayout->addWidget(m_spreadComboBox,7,1); m_rightLayout->addWidget(m_brushColorLabel,8,0); m_rightLayout->addWidget(m_brushColorFrame,8,1); m_rightLayout->addWidget(m_brushColorBtn,8,2); m_rightLayout->addWidget(m_brushStyleLabel,9,0); m_rightLayout->addWidget(m_brushStytleComboBox,9,1); QHBoxLayout* mainLayout = new QHBoxLayout(this); mainLayout->addWidget(m_paintArea); mainLayout->addLayout(m_rightLayout); ShowShape(m_shapeCombox->currentIndex()); } //变更每项设置后,更新图像 void MainWidget::ShowShape(int value) { PaintArea::Shape shape =PaintArea::Shape (m_shapeCombox->itemData(value).toInt());//获取用户选择的形状 m_paintArea->setShape(shape); } void MainWidget::ShowPenColor() { QColor color = QColorDialog::getColor(Qt::black); m_penColorFrame->setPalette(QPalette(color)); int value = m_penWithSpinBox->value(); int styleIndex = m_penStyleComboBox->currentIndex(); Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt()); int capIndex = m_penCapComboBox->currentIndex(); Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt()); int joinIndex = m_penJoinComboBox->currentIndex(); Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt()); //将当前画笔的各个参数传递-设置 m_paintArea->setPen(QPen(color,value,style,cap,join)); } void MainWidget::ShowPenWidth(int value) { QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值 m_penColorFrame->setPalette(QPalette(color)); int penWidth =value; int styleIndex = m_penStyleComboBox->currentIndex(); Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt()); int capIndex = m_penCapComboBox->currentIndex(); Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt()); int joinIndex = m_penJoinComboBox->currentIndex(); Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt()); //将当前画笔的各个参数传递-设置 m_paintArea->setPen(QPen(color,penWidth,style,cap,join)); } void MainWidget::ShowPenStyle(int value) { QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值 m_penColorFrame->setPalette(QPalette(color)); int penWidth = m_penWithSpinBox->value(); Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(value).toInt()); if(style == Qt::CustomDashLine)//如果是自定义的 { QVector<qreal> dashes; qreal space = 4; dashes<<1<<space<<2<<space<<3<<space<<4<<space; m_paintArea->m_pen.setDashPattern(dashes); m_paintArea->update(); } else { int capIndex = m_penCapComboBox->currentIndex(); Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt()); int joinIndex = m_penJoinComboBox->currentIndex(); Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt()); //将当前画笔的各个参数传递-设置 m_paintArea->setPen(QPen(color,penWidth,style,cap,join)); } } void MainWidget::ShowPenCap(int value) { QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值 m_penColorFrame->setPalette(QPalette(color)); int penWidth =m_penWithSpinBox->value(); int styleIndex = m_penStyleComboBox->currentIndex(); Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt()); // int capIndex = m_penCapComboBox->currentIndex(); Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(value).toInt()); int joinIndex = m_penJoinComboBox->currentIndex(); Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(joinIndex).toInt()); //将当前画笔的各个参数传递-设置 m_paintArea->setPen(QPen(color,penWidth,style,cap,join)); } void MainWidget::ShowPenJoin(int value) { QColor color = m_penColorFrame->palette().color(QPalette::Window);//获取颜色框中关于窗体的颜色值 m_penColorFrame->setPalette(QPalette(color)); int penWidth =m_penWithSpinBox->value(); int styleIndex = m_penStyleComboBox->currentIndex(); Qt::PenStyle style = Qt::PenStyle(m_penStyleComboBox->itemData(styleIndex).toInt()); int capIndex = m_penCapComboBox->currentIndex(); Qt::PenCapStyle cap = Qt::PenCapStyle(m_penCapComboBox->itemData(capIndex).toInt()); // int joinIndex = m_penJoinComboBox->currentIndex(); Qt::PenJoinStyle join = Qt::PenJoinStyle(m_penJoinComboBox->itemData(value).toInt()); //将当前画笔的各个参数传递-设置 m_paintArea->setPen(QPen(color,penWidth,style,cap,join)); } void MainWidget::ShowFillRule(int value) { Qt::FillRule rule = Qt::FillRule(value); m_paintArea->setFillRule(rule); } void MainWidget::ShowSpreadStyle(int value) { m_spread = QGradient::Spread(value); } void MainWidget::ShowBrushColor() { QColor color = QColorDialog::getColor(Qt::green); m_brushColorFrame->setPalette(QPalette(color)); ShowBrush(m_brushStytleComboBox->currentIndex()); } void MainWidget::ShowBrush(int value) { QColor color = m_brushColorFrame->palette().color(QPalette::Window); int brush = m_brushStytleComboBox->itemData(value).toInt(); Qt::BrushStyle style = Qt::BrushStyle(brush); //线性渐变 if(style == Qt::LinearGradientPattern) { //指定线性渐变的区域 QLinearGradient lineGradient(0,0,400,400); //指定某个位置的渐变色,pos取值范围0~1 lineGradient.setColorAt(0.0,Qt::white); lineGradient.setColorAt(0.2,color); lineGradient.setColorAt(1.0,Qt::black); lineGradient.setSpread(m_spread); m_paintArea->setBrush(lineGradient); } //环形渲染 else if(style == Qt::RadialGradientPattern) { //中心坐标,半径长度,焦点坐标,如果需要对称,则中心坐标和焦点坐标保持一致 QRadialGradient radiaGrdient(200,200,150,200,200); radiaGrdient.setColorAt(0.0,Qt::white); radiaGrdient.setColorAt(0.2,color); radiaGrdient.setColorAt(1.0,Qt::black); m_paintArea->setBrush(radiaGrdient); } //弧度渲染 else if(style == Qt::ConicalGradientPattern) { //中心坐标,角度 QConicalGradient conicaoGradient(200,200,30); conicaoGradient.setColorAt(0.0,Qt::white); conicaoGradient.setColorAt(0.2,color); conicaoGradient.setColorAt(1.0,Qt::black); m_paintArea->setBrush(conicaoGradient); } else if(style == Qt::TexturePattern) { m_paintArea->setBrush(QBrush(QPixmap("test1.jpg"))); } //其他 else { m_paintArea->setBrush(QBrush(color,style)); } }
paintarea.h
#ifndef PAINTAREA_H #define PAINTAREA_H #include <QWidget> #include<QPen> #include<QBrush> class PaintArea : public QWidget { Q_OBJECT public: enum Shape{Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap}; explicit PaintArea(QWidget *parent = nullptr); public: void setShape(Shape shape); void setPen(QPen pen); void setBrush(QBrush brush); void setFillRule(Qt::FillRule rule); protected: void paintEvent(QPaintEvent *event)override; public: QPen m_pen; private: Shape m_shape; QBrush m_brush; Qt::FillRule m_fillrule; signals: public slots: }; #endif // PAINTAREA_H
paintarea.cpp
#include "paintarea.h" #include<QPainter> PaintArea::PaintArea(QWidget *parent) : QWidget(parent) { setPalette(QPalette(Qt::white)); setAutoFillBackground(true);//设置背景自动填充 setFixedSize(400,400); } void PaintArea::setShape(PaintArea::Shape shape) { m_shape = shape; update(); } void PaintArea::setPen(QPen pen) { m_pen = pen; update(); } void PaintArea::setBrush(QBrush brush) { m_brush = brush; update(); } void PaintArea::setFillRule(Qt::FillRule rule) { m_fillrule = rule; update(); } void PaintArea::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setPen(m_pen); painter.setBrush(m_brush); QRect rect(50,100,300,200);//起始位置,宽高 const QPoint points[4]= { QPoint(150,100), QPoint(300,150), QPoint(100,300), QPoint(100,300) }; int startAngle = 30 * 16;//1/16 int spanAngle = 120 * 16; QPainterPath path; path.addRect(150,150,100,100); path.moveTo(100,200); path.cubicTo(300,100,200,200,300,300); path.cubicTo(100,300,200,200,100,100); path.setFillRule(m_fillrule); switch(m_shape) { case Line: painter.drawLine(rect.topLeft(),rect.bottomRight()); break; case Rectangle: painter.drawRect(rect); break; case RoundRect: painter.drawRoundRect(rect); break; case Ellipse: painter.drawEllipse(rect); break; case Polygon://多边形,默认为4变形 painter.drawPolygon(points,4); break; case Polyline: painter.drawPolyline(points,4); break; case Points: painter.drawPoints(points,4); break; case Arc: painter.drawArc(rect, startAngle,spanAngle); break; case Path: painter.drawPath(path); break; case Text: painter.drawText(rect,Qt::AlignCenter,tr("Hello world!")); break; case Pixmap: painter.drawPixmap(50,100,QPixmap("test1.jpg")); break; default: break; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。