利用QPainter绘制各种图形
2015-08-24 17:08
429 查看
利用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
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; } }
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
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)); } }
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(); }
6、编译运行
7、资源代码文件
相关文章推荐
- SharePoint 2013 - Cross-domain Library
- network namespace 与veth pair
- UNIX SIGIO信号的使用http://blog.csdn.net/msda/article/details/8090748
- AIX配置时间服务器(NTP)
- xcode提示: failed to get the task for process 解决方法
- Contains Duplicate -- leetcode
- dojo的TabContainer竖排摆放tab标签
- UVA 10900 So you want to be a 2n-aire? 2元富翁 (数学期望,贪心)
- solr源码分析之数据导入DataImporter追溯。
- hdu 4585 set + pair
- [LeedCode OJ]#219 Contains Duplicate II
- [LeedCode OJ]#217 Contains Duplicate
- ORA-15081: failed to submit an I/O operation to a disk
- [LeedCode OJ]#172 Factorial Trailing Zeroes
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) C(组合数+容斥)
- ubuntu编译airplay
- [LeedCode OJ]#70 Climbing Stairs
- svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
- contains选择器
- WebLogic11g-半小时让你的domain集群化