1. 绘制图形
-
protected:
-
void paintEvent(QPaintEvent *);
-
void Widget::paintEvent((QPaintEvent *event)
-
{
-
QPainter painter(this); //this为绘图设备,即表明在该部件上进行绘制
-
painter.drawLine(QPaint(0, 0), QPaint(100, 100));
-
}
QPainter painter(this); // 会立即开始在设备上绘制,自动调用begin()函数,然后析构函数中调用end()函数结束绘制。
QPainter painter;// 不带参数时,可以在后面调用QPainter::begin(QPaintDevice *device)来指定绘制设置,然后用完再调用end()函数。
等价于
-
void Widget::paintEvent((QPaintEvent *event)
-
{
-
QPainter painter;
-
painter.begin(this);
-
painter.drawLine(QPaint(0, 0), QPaint(100, 100));
-
painter.end();
-
}
2. 使用画刷
画刷可以设置颜色和填充模式
-
QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);
-
painter.setBrush(brush);
3. 使用画笔
-
//参数为:画刷,线宽,画笔风格,画笔端点,画笔连接风格
-
QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
-
painter.setPen(pen);
4. 绘制矩形
painter.drawRect(0, 0, 100, 80); //x,y,w,h
5. 绘制椭圆(圆)
painter.drawEllipse(0, 0, 100, 80); //x,y,w,h
6. 绘制圆弧
-
QRectF rect(70.0, 40.0, 80.0, 60.0); //x,y,w,h
-
int startAngle = 30 * 16; //值为,实际角度 * 16
-
int spanAngle = 120 * 16;
-
//三个参数:rect表示弧线所在的矩形,startAngle起始角度,spanAngle跨越角度
-
painter.drawArc(rect, startAngle, spanAngle);
7. 绘制扇形
-
QRectF rect_top(20.0, 20.0, 100.0, 100.0);
-
// 扇形起始角度
-
int startAngle = 0 * 16;
-
// 扇形覆盖范围(120度的)
-
int spanAngle = 120 * 16;
-
painter.drawPie(rect_top, startAngle, spanAngle);
8. 绘制多边形
-
QPolygon pts;
-
pts.setPoints(3, -1,0, 1,0, 0,39); //第一个参数表示3个点,后面是三个点坐标
-
painter.drawConvexPolygon(pts);
9. 绘制路径
-
QPainterPath path;
-
path.addEllipse(-4, -4, 8, 8);//添加一个圆
-
path.addRect(-5, -5, 10, 10); //添加一个矩形
-
painter.drawPath(path);
在填充路径时要用到填充规则,这里一共有两个填充规则
path.setFillRule(Qt::OddEventFil);//奇偶填充规则
如果要判断一个点是否在图形中,可以从该点向图形外引一条水平线,如果该水平线与图形的交点人个数为奇数,那么该点在在图形中。
只填充在图形内的点
path.setFillRule(Qt::WindingFill); //非零弯曲规则
如果要判断一个点是否在图形中,可以从该点向图形外引一条水平线,如果该水平线与图形的边线相交,这个边线是顺时针绘制的,就记为1,是逆时针绘制的就记为-1,然后将所有数值相加,结果不为0,那么该点就在图形中。
10. 绘制圆环
根据以上的填充规则,可以得到绘制圆环的一个方便的方法
-
QPainterPath path;
-
path.addEllipse(0,0,100,100);
-
path.addEllipse(25,25,50,50);
-
painter.setBrush(Qt::blue);
-
path.setFillRule(Qt::OddEventFil);//使用奇偶填充,刚好可以只显示圆环
-
painter.drawPath(path);
11. 填充与擦除
-
//使用画刷填充一个矩形区域
-
painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow));
-
//擦除一个矩形区域的内容
-
painter.eraserRect(QRect(50,0,50,120));
-
//绘制曲线************************************************************************************
-
功能描述:用曲线来显示数据的变化情况。横坐标表示时间T,纵坐标Y。每隔一定时间取一个Y值确定纵坐标
点击(此处)折叠或打开
- #include "dialog.h"
- #include "ui_dialog.h"
- Dialog::Dialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::Dialog)
- {
- ui->setupUi(this);
- // resize(600,500); //窗口大小设置为600*500
- p = t = 0;
- Point.setX(0); /* 初始化起始点的纵坐标为0 */
- Point.setY(0); /* 初始化起始点的横坐标为0 */
- path = new QPainterPath;
- timer = new QTimer(this);
- connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定时器计满信号和相应的槽函数
- timer->start(500);
- }
- Dialog::~Dialog()
- {
- delete ui;
- }
- /* 定时时间到 */
- void Dialog::timerUpDate()
- {
- t += 10;
- Point.setX(t); /* 时间加二秒 */
- Point.setY(qrand() % 100); /* 设置纵坐标值 */
- path->lineTo(Point); /* */
- if(t > width()) /* 当时间值 T大于窗口的宽度时需调整坐标原点 */
- p -= 10; /* 调整坐标原点 */
- update();
- }
- /* 开启绘画曲线 也就是开启定时器 */
- void Dialog::startPainting(void)
- {
- timer->start(2000);
- }
- /* 停止绘画曲线 也就是停止定时器 */
- void Dialog::closePainting(void)
- {
- timer->stop();
- }
- /* 重绘事件函数 */
- void Dialog::paintEvent(QPaintEvent *)
- {
- QPainter painter(this);
- painter.setPen(QPen(Qt::red, 2)); //设置画笔颜色和大小
- painter.translate(p,0); //调整坐标原点
- painter.drawPath(*path); /* 绘制路径 */
- }
QT 绘制事件 PaintEvent
对事件的响应是通过信号与槽调用
事件中根据事件触发的条件发出不同的信号
比如:鼠标事件发出clicked与dblclicked等信号
QT中事件是怎么实现的?
QT把事件自己定义成固定的virtual保护函数
这些函数自动被系统调用
1. paintEvent
案例:
1. 覆盖QWidget的paintEvent
绘制gdi(Graphics DrawInterface)
代码:
main.cpp
#include<QApplication>
#include<QWidget>
#include “PaintWidget.h”
int main(int args , char **argv)
{
QApplication app(args , argv);
PaintWidget w;
w.resize(400,400);
w.setVisible(true);
return app.exec();
}
main.pro
TEMPLATE=app
SOURCES=main.cpp PaintWidget.cpp
HEADERS=PaintWidget.h
CONFIG=release qt
QT=core gui
TARGET=main
PaintWidget.h
#ifndef PAINT_WIDGET_H
#define PAINT_WIDGET_H
#include<QWidget>
#include<QPaintEvent>
class PaintWidget:public QWidget
{
protected:
virtual void paintEvent( QPaintEvent * e);
};
#endif
PaintWidget.cpp
#include “PaintWidget.h”
#include<QPainter>
#include<QPoint>
#include<QImage>
#include<QPixmap>
#include<QBitmap>
#include<QPen>
void PaintWidget::paintEvent(QPaintEvent * e)
{
QPoint p[3];
p[0].setX(10);
p[0].setY(10);
p[1].setX(300);
p[1].setY(10);
p[2].setX(145);
p[2].setY(200);
QImage img(“ok.png”);
QPixmap map(“ok.png”);
QBitmap bit=map.createMaskFromColor(QColor(0,0,0));
// QPen pen(QColor(255,0,0));
QBrush br(QColor(0,255,0));
QPen pen();
//纯黑色设置为透明
//进行绘制工作
//1.产生绘制对象QPainter
QPainter g(this); //this参数指定绘制的目标
//2.设置绘制对象的属性
g.setPen(pen);
g.setFont(“楷书”,45,100); //设置字体
//3.进行绘制:图形,图像与字符串
g.drawLine(10,10,400,400);
g.drawArc(10,10,300,300,10*16,120*16);
//前4个参数为弧的外切矩形,参数5,6为起始角度和结束角度,1/16度数
g.drawConvexPolygon(p,3); //参数2为多边形的顶点个数
g.drawEllipase(0,0,this->width(),this->height());
g.drawText(100,100, “this is a maomaochong”);
g.drawImage(10,10,img);
g.drawPixmap(10,10,300,300,bit);
}
来源:oschina
链接:https://my.oschina.net/u/4395489/blog/4503407