1  如果要在绘图设备(一般为窗口部件)上绘图,只需创建一个QPainter,再将指针传到该设备中。

例如:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

}

2  常用的初始化:画笔、画刷、字体

画笔:用来画线和边缘。它包含颜色、宽度、线性、拐点风格以及连线风格。

画刷:用来填充几何图形的图案。它一般由颜色和风格组成,但同时也可以是纹理(一个不断重复的图像)或者是一个渐变。

字体:用来绘制文字。字体有很多属性,包括字体族和磅值大小。

5.具体的实例

通过建立一个画图面板来了解Qpainter是怎样绘制图形的,其中包含两个类,画图的区域PainterArea类和主窗口mainWindow类

(1)实现PainterArea类

//paintarea.h

#ifndef PAINTAREA_H

#define PAINTAREA_H

#include

#include

#include

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 setFillRule(Qt::FillRule);//设置填充模式

void paintEvent(QPaintEvent *);//重画事件

private:

Shape shape;

QPen pen;

QBrush brush;

Qt::FillRule fillRule;

};

#endif // PAINTAREA_H

//paintarea.cpp

#include "paintarea.h"

#include

PaintArea::PaintArea(QWidget *parent)

:QWidget(parent)

{

setPalette(QPalette(Qt::white)); //设置背景颜色

setAutoFillBackground(true);//设置自动填充背景色

setMinimumSize(400,400);//设置窗口最下大小

}

void PaintArea::setShape(Shape s) //update()更新窗口部件

{

shape=s;

update();

}

void PaintArea::setPen(QPen p)

{

pen=p;

update();

}

void PaintArea::setBrush(QBrush b)

{

brush=b;

update();

}

void PaintArea::setFillRule(Qt::FillRule rule)

{

fillRule=rule;

update();

}

//重画事件

void PaintArea::paintEvent(QPaintEvent *)

{

QPainter p(this);

p.setPen(pen);

p.setBrush(brush);

QRect rect(100,100,250,200);//构造一个矩形

static const QPoint points[4]={

QPoint(100,100),

QPoint(200,150),

QPoint(300,250),

QPoint(150,300)

};//确定Points的四个点的坐标

int startAngle=60*16;

int spanAngle=180*16; //为绘制曲线设置参数变量

QPainterPath path; //QPainterPath为Qpainter类提供了一个存储容器,里面包含了画的内容和画的顺序,

path.moveTo(50,150); //当前位置移动到坐标50,150

path.lineTo(350,150); //当前位置开始画直线,终点位置坐标350,150

path.lineTo(100,325);

path.lineTo(200,50);

path.lineTo(300,325);

path.lineTo(50,150);

path.setFillRule(fillRule); //设置填充模式

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); //绘制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("1.png"));//绘制一个图像

break;

default:

break;

}

}

//前面的椭圆形、直线、长方形、圆角矩形,弧 都是利用矩形为骨架构成的,具体如何构成参照介绍中的绘制函数中的图。

(2)实现主窗口类MainWidget

//mainwindow.h头文件

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include

#include

#include

#include

#include

#include

class MainWindow : public QWidget

{

Q_OBJECT

public:

MainWindow(QWidget *parent = 0);

~MainWindow();

private:

PaintArea *paintArea;

QLabel *shapelabel;//形状

QComboBox *shapeComboBox;

QLabel *penWidthLable;//画笔宽度

QSpinBox *penWidthSpinBox;

QLabel *penColorLabel;//画笔颜色

QFrame *penColorFrame;

QPushButton *penColorbtn;//画笔颜色按钮

QLabel *penStyleLabel;

QComboBox *penStyleComboBox;//画笔风格

QLabel *penCapLabel;

QComboBox *penCapComboBox;

QLabel *penJoinLabel;

QComboBox *penJoinComboBox;

QLabel *fillLabel;

QComboBox *fillComboBox;

QLabel *brushStyleLabel;

QComboBox *brushStyleComboBox;

QLabel *brushColorlabel;

QFrame *brushColorFrame;

QPushButton *brushColorbtn;

QGridLayout *settingLayout;

protected slots:

void ShowShape(int);

void ShowPenWidth(int);

void ShowPenColor();

void ShowPenStyle(int);

void ShowPenCap(int);

void ShowPenJoin(int);

void ShowFill();

void ShowBrushColor();

void ShowBrush(int);

};

#endif // MAINWINDOW_H

//mainwindow.cpp

#include"mainwindow.h"

#include "paintarea.h"

#include

MainWindow::MainWindow(QWidget *parent)

: QWidget(parent)

{

paintArea=new PaintArea;

shapelabel=new QLabel("形状:"); //形状选择下拉列表框

shapeComboBox=new QComboBox;

shapeComboBox->addItem(tr("Line"),PaintArea::Line);

shapeComboBox->addItem(tr("RoundRect"),PaintArea::RoundRect);

shapeComboBox->addItem(tr("Ellipse"),PaintArea::Ellipse);

shapeComboBox->addItem(tr("Polygon"),PaintArea::Polygon);

shapeComboBox->addItem(tr("Polyline"),PaintArea::Polyline);

shapeComboBox->addItem(tr("Points"),PaintArea::Points);

shapeComboBox->addItem(tr("Arc"),PaintArea::Arc);

shapeComboBox->addItem(tr("Rectangle"),PaintArea::Rectangle);

shapeComboBox->addItem(tr("Path"),PaintArea::Path);

shapeComboBox->addItem(tr("Text"),PaintArea::Text);

shapeComboBox->addItem(tr("Pixmap"),PaintArea::Pixmap);

connect(shapeComboBox,SIGNAL(activated(int)),this,SLOT(ShowShape(int)));

penColorLabel=new QLabel("画笔颜色:"); //画笔颜色选择控件

penColorFrame=new QFrame;

penColorFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);//Panel - QFrame画一个平板使内容看起来凸起或者凹陷,

//QFrame::Sunken - 框架和内容看起来凹陷

penColorFrame->setAutoFillBackground(true);

penColorFrame->setPalette(QPalette(Qt::blue));//设置默认颜色为蓝色

penColorbtn=new QPushButton;

connect(penColorbtn,SIGNAL(clicked()),this,SLOT(ShowPenColor()));

penWidthLable=new QLabel("画笔宽度:");//画笔宽度选择控件

penWidthSpinBox=new QSpinBox;

penWidthSpinBox->setRange(0,20);//设置字宽滑块的取值范围

connect(penWidthSpinBox,SIGNAL(valueChanged(int)),this,SLOT(ShowPenWidth(int)));

penStyleLabel=new QLabel; //画笔风格选择下拉列表框

penStyleComboBox=new QComboBox;

penStyleComboBox->addItem(tr("SolidLine"),Qt::SolidLine);

penStyleComboBox->addItem(tr("DashLine"),Qt::DashLine);

penStyleComboBox->addItem(tr("DotLine"),Qt::DotLine);

penStyleComboBox->addItem(tr("DashDotLine"),Qt::DashDotLine);

penStyleComboBox->addItem(tr("DashDotDotLine"),Qt::DashDotDotLine);

penStyleComboBox->addItem(tr("CustomDashLine"),Qt::CustomDashLine);//这段如果报错,可以把addItem后面的参数置换为int类的数字

connect(penStyleComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenStyle(int)));

penCapLabel=new QLabel; //画顶端风格选择下拉列表框

penCapComboBox=new QComboBox;

penCapComboBox->addItem(tr("SquareCap"),Qt::SquareCap);

penCapComboBox->addItem(tr("FlatCap"),Qt::FlatCap);

penCapComboBox->addItem(tr("RoundCap"),Qt::RoundCap);

connect(penCapComboBox,SIGNAL(activated(int)),this,SLOT(ShowPenCap(int)));

penJoinLabel=new QLabel;//画笔连接点风格选择下拉列表框

penJoinComboBox=new QComboBox;

penJoinComboBox->addItem(tr("BevelJoin"),Qt::BevelJoin);

penJoinComboBox->addItem(tr("MiterJoin"),Qt::MiterJoin);

penJoinComboBox->addItem(tr("RoundJoin"),Qt::RoundJoin);

fillLabel=new QLabel;//填充模式选择下拉列表框

fillComboBox=new QComboBox;

fillComboBox->addItem(tr("Odd Even"),Qt::OddEvenFill);

fillComboBox->addItem(tr("Winding"),Qt::WindingFill);

connect(fillComboBox,SIGNAL(activated(int)),this,SLOT(ShowFill()));

brushColorlabel=new QLabel;//画刷风格选择下拉列表框

brushColorFrame=new QFrame;

brushColorbtn=new QPushButton;

brushColorFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);

brushColorFrame->setAutoFillBackground(true);

brushColorFrame->setPalette(QPalette(Qt::green));

connect(brushColorbtn,SIGNAL(clicked()),this,SLOT(ShowBrushColor()));

brushStyleLabel=new QLabel; //画刷风格选择下拉列表框

brushStyleComboBox=new QComboBox;

brushStyleComboBox->addItem(tr("SolidPattern"),1);

brushStyleComboBox->addItem(tr("Dense1Pattern"),2);

brushStyleComboBox->addItem(tr("Dense2Pattern"),3);

brushStyleComboBox->addItem(tr("Dense3Pattern"),4);

brushStyleComboBox->addItem(tr("Dense4Pattern"),5);

brushStyleComboBox->addItem(tr("Dense5Pattern"),6);

brushStyleComboBox->addItem(tr("Dense6Pattern"),7);

brushStyleComboBox->addItem(tr("Dense7Pattern"),8);

brushStyleComboBox->addItem(tr("HorPattern"),9);

brushStyleComboBox->addItem(tr("VerPattern"),10);

brushStyleComboBox->addItem(tr("CrossPattern"),11);

brushStyleComboBox->addItem(tr("BDiagPattern"),12);

brushStyleComboBox->addItem(tr("FDiagPattern"),13);

brushStyleComboBox->addItem(tr("DiagCrossPattern"),14);

brushStyleComboBox->addItem(tr("LinearGradientPattern"),15);

brushStyleComboBox->addItem(tr("ConicalGradientPattern"),16);

brushStyleComboBox->addItem(tr("RadialGradientPattern"),17);

brushStyleComboBox->addItem(tr("TexturePattern"),24);

connect(brushStyleComboBox,SIGNAL(activated(int)),this,SLOT(ShowBrush(int)));

settingLayout=new QGridLayout;//画板布局

settingLayout->addWidget(shapelabel,0,0);

settingLayout->addWidget(shapeComboBox,0,1);

settingLayout->addWidget(penColorLabel,0,2);

settingLayout->addWidget(penColorFrame,0,3);

settingLayout->addWidget(penColorbtn,0,4);

settingLayout->addWidget(penWidthLable,1,0);

settingLayout->addWidget(penWidthSpinBox,1,1);

settingLayout->addWidget(penStyleLabel,1,2);

settingLayout->addWidget(penStyleComboBox,1,3);

settingLayout->addWidget(penCapLabel,2,0);

settingLayout->addWidget(penCapComboBox,2,1);

settingLayout->addWidget(penJoinLabel,2,2);

settingLayout->addWidget(penJoinComboBox,2,3);

settingLayout->addWidget(fillLabel,3,0);

settingLayout->addWidget(fillComboBox,3,1);

settingLayout->addWidget(brushColorlabel,3,2);

settingLayout->addWidget(brushColorFrame,3,3);

settingLayout->addWidget(brushColorbtn,3,4);

settingLayout->addWidget(brushStyleLabel,4,0);

settingLayout->addWidget(brushStyleComboBox,4,1);

QVBoxLayout *mainLayout=new QVBoxLayout(this);

mainLayout->addLayout(settingLayout);

mainLayout->addWidget(paintArea);

ShowShape(shapeComboBox->currentIndex());

}

//以下就是各种槽函数了

void MainWindow::ShowShape(int value)

{

PaintArea::Shape shape=PaintArea::Shape(shapeComboBox->itemData(value,Qt::UserRole).toInt());

paintArea->setShape(shape);

}

void MainWindow::ShowPenWidth(int value)//画笔宽度

{

QColor color=penColorFrame->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());

paintArea->setPen(QPen(color,value,style,cap,join));

}

void MainWindow::ShowPenColor()//画笔颜色

{

QColor color=QColorDialog::getColor(Qt::blue);

penColorFrame->setPalette(QPalette(color));

int value=penWidthSpinBox->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());

paintArea->setPen(QPen(color,value,style,cap,join));

}

void MainWindow::ShowPenStyle(int styleValue)//画笔风格

{

QColor color=penColorFrame->palette().color(QPalette::Window);

int value=penWidthSpinBox->value();

Qt::PenStyle style=Qt::PenStyle(penStyleComboBox->itemData(styleValue,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());

paintArea->setPen(QPen(color,value,style,cap,join));

}

void MainWindow::ShowPenCap(int capValue)//顶端风格

{

QColor color=penColorFrame->palette().color(QPalette::Window);

int value=penWidthSpinBox->value();

Qt::PenStyle style=Qt::PenStyle(penStyleComboBox->itemData(penStyleComboBox->currentIndex(),Qt::UserRole).toInt());

Qt::PenCapStyle cap=Qt::PenCapStyle(penCapComboBox->itemData(capValue,Qt::UserRole).toInt());

Qt::PenJoinStyle join=Qt::PenJoinStyle(penJoinComboBox->itemData(penJoinComboBox->currentIndex(),Qt::UserRole).toInt());

paintArea->setPen(QPen(color,value,style,cap,join));

}

void MainWindow::ShowPenJoin(int joinValue)//画笔连接点风格

{

QColor color=penColorFrame->palette().color(QPalette::Window);

int value=penWidthSpinBox->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(joinValue,Qt::UserRole).toInt());

paintArea->setPen(QPen(color,value,style,cap,join));

}

void MainWindow::ShowFill()//填充模式

{

Qt::FillRule fill=Qt::FillRule(fillComboBox->itemData(fillComboBox->currentIndex(),Qt::UserRole).toInt());

paintArea->setFillRule(fill);

}

void MainWindow::ShowBrushColor()//画刷颜色

{

QColor color=QColorDialog::getColor(Qt::blue);

brushColorFrame->setPalette(QPalette(color));

ShowBrush(brushStyleComboBox->currentIndex());

}

void MainWindow::ShowBrush(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,400,400);//线性渐变的起止点位置

linearGradient.setColorAt(0.0,Qt::white);//渐变比和渐变颜色

linearGradient.setColorAt(0.2,color);

linearGradient.setColorAt(1.0,Qt::black);

paintArea->setBrush(linearGradient);

}

else if(style==Qt::RadialGradientPattern)//圆形渐变

{

QRadialGradient radialGradient(200,200,150,150,100);//中心点,半径,焦点

radialGradient.setColorAt(0.0,Qt::white);

radialGradient.setColorAt(0.2,color);

radialGradient.setColorAt(1.0,Qt::black);

paintArea->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);

paintArea->setBrush(conicalGradient);

}

else if(style==Qt::TexturePattern)

{

paintArea->setBrush(QBrush(QPixmap("2.png")));

}

else

{

paintArea->setBrush(QBrush(color,style));

}

}

MainWindow::~MainWindow()

{

}

qframe 绘图_QT 基本图形绘制相关推荐

  1. iOS:quartz2D绘图(给图形绘制阴影)

    quartz2D既可以绘制原始图形,也可以给原始图形绘制阴影. 绘制阴影时,需要的一些参数:上下文.阴影偏移量.阴影模糊系数 注意:在drawRect:方法中同时调用绘制同一个图形时,在对绘制的图形做 ...

  2. [Qt教程] 第11篇 2D绘图(一)绘制简单图形

    [Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主  发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...

  3. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  4. java绘图技术,演示绘制不同的图形

    java绘图技术,演示绘制不同的图形. 做一个笔记,方便日后查找. import javax.swing.*; import java.awt.*;public class DrawCircle ex ...

  5. java画布制作弧形文字_QT 使用QPainter 绘制图形 和 世界变换 world transform

    1. 绘制椭圆  饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...

  6. 第11篇 2D绘图(一)绘制简单图形

    导语 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执 ...

  7. 计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制

    实验一 VS+OpenGL绘图环境及基本图形绘制 一.实验目的 熟悉OpenGL的主要功能: 掌握OpenGL的绘图流程和原理: 掌握OpenGL核心函数的使用: 熟悉OpenGL基本图形元素的绘制函 ...

  8. 【Qt入门第11篇】 2D绘图(一)绘制简单图形

    导语 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执 ...

  9. COMSOL与MATLAB联合仿真6:绘制绘图组的图形,并提取其中的数据

    COMSOL与MATLAB联合仿真的思路与COMSOL的仿真思路一脉相承. 先几何模型.物理场.材料.网格,然后计算,最后进行后处理(数据分析). 本文涉及的是后处理的一部分内容.提取绘图组的图形和其 ...

最新文章

  1. 转:Eclipse中打开文件所在文件夹的插件及设置
  2. LeetCode 20 有效的括号
  3. 如何在html 中引入其它html文件
  4. 如何在Java中实现线程池
  5. Java集合---HashSet的源码分析
  6. 团队作业-第二周-测试计划
  7. 初识Git-GitHub
  8. python显示多个图表
  9. ucinet计算聚类系数大于1怎么办_UCINET 6
  10. 最小生成树 刘汝佳模板
  11. 流量控制理论与Sentinel
  12. firefox 无法启动
  13. Python关于socket的一个小型服务器和客户机实例
  14. 怎样给图片降噪?这几个图片降噪软件可以帮助你
  15. oracle中sql的递归查询运用
  16. 鼠标指针下总出现一个滚动条似的方框,怎么办?有图
  17. 如何理解混淆矩阵,以及预测少数类的评估指标?
  18. Codeforces 371 A,B,C
  19. Distiller:神经网络压缩研究框架
  20. 当我闲困的时候,我在想些什么

热门文章

  1. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)...
  2. webrtc rtc_base Copy_on_write_Buffe类功能剖析
  3. 关于[flv @ 00000248bab4c420] Tag avc1/0x31637661 incompatible with output codec id ‘28‘ ([7][0][0][0])
  4. 团队项目(第四周冲刺之二)—GG队
  5. 如何将txt格式转换成lrc格式???
  6. 【计算机毕业设计】交通事故档案管理系统
  7. Android本地文件点击视频播放器vitamio版
  8. 如何用AD绘制一块还算优美的PCB板
  9. 老男孩教育day2学习总结
  10. 巧妙使用ABBYY FineReader PDF 15页面管理功能调整页面布局