QT 使用QPainter 绘制图形 和 世界变换 world transform
1. 绘制椭圆 饼状型 贝塞尔曲线
绘制图像重写方法 void paintEvent(QPaintEvent *event)即可。
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter1(this); //新建画笔
painter1.setRenderHint(QPainter::Antialiasing, true); //设置 反走样
painter1.setPen(QPen(Qt::black, 8, Qt::DashDotLine, Qt::RoundCap)); //设置线条 颜色, 大小,线型风格,拐点风格
painter1.setBrush(QBrush(Qt::green, Qt::SolidPattern)); //设置画刷 颜色 和 风格
painter1.drawEllipse(10, 10, 160, 80); //画椭圆 QPainter painter2(this);
painter2.setRenderHint(QPainter::Antialiasing, true);
painter2.setPen(QPen(Qt::black, 8, Qt::DashDotLine, Qt::RoundCap));
painter2.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));
painter2.drawPie(10, 150, 200, 120, 60*16, 270*16); QPainter painter3(this);
painter3.setRenderHint(QPainter::Antialiasing, true);
QPainterPath path; //轨迹
path.moveTo(200, 150); //先移到这个点
path.cubicTo(250, 80, 320, 80, 400, 150); //x1 x2 和 andpoint 确定弧形
painter3.setPen(QPen(Qt::black, 8));
painter3.setBrush(QBrush(Qt::green, Qt::DiagCrossPattern)); QTransform transform; //世界变换
transform.translate(0, 0); //以00为中心 选装30°
transform.rotate(+30.0);
painter3.setWorldTransform(transform); //添加世界变换
painter3.drawPath(path);
}
2. 仪表盘
oventimer.h
#ifndef OVENTIMER_H
#define OVENTIMER_H #include <QWidget>
#include <QtGui> class OvenTimer : public QWidget
{
Q_OBJECT public:
OvenTimer(QWidget *parent = 0); void setDuration(int secs);
int duration() const;
void draw(QPainter *painter); signals:
void timeout(); protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event); private:
QDateTime finishTime;
QTimer *updateTimer;
QTimer *finishTimer;
}; #endif // OVENTIMER_H
oventimer.cpp
#include "oventimer.h"
#include <QtGui>
#include <QtCore>
#include <math.h> const double DegreesPerMinute = 7.0;
const double DegressPerSecond = DegreesPerMinute/60;
const int MaxMinutes = 45;
const int MaxSeconds = MaxMinutes*60;
const int UpdateInterval = 5; OvenTimer::OvenTimer(QWidget *parent)
: QWidget(parent)
{
finishTime = QDateTime::currentDateTime();
updateTimer = new QTimer(this);
connect(updateTimer, SIGNAL(timeout()), this, SLOT(update())); finishTimer = new QTimer(this);
finishTimer->setSingleShot(true);
connect(finishTimer, SIGNAL(timeout()), this, SIGNAL(stop()));
connect(finishTimer, SIGNAL(timeout()), updateTimer, SLOT(stop())); QFont font;
font.setPointSize(8);
setFont(font);
} void OvenTimer::setDuration(int secs)
{
secs = qBound(0, secs, MaxSeconds);
finishTime = QDateTime::currentDateTime().addSecs(secs);
if( secs > 0 )
{
updateTimer->start(UpdateInterval*1000);
finishTimer->start(secs*1000);
}
else
{
updateTimer->stop();
finishTimer->stop();
}
update();
} int OvenTimer::duration() const
{
int secs = QDateTime::currentDateTime().secsTo(finishTime);
if( secs < 0 )
secs = 0;
return secs;
} void OvenTimer::mousePressEvent(QMouseEvent *event)
{
QPointF point = event->pos() - rect().center();
double theta = atan2(-point.x(), -point.y())*180.0/M_PI;
setDuration(duration() + int(theta / DegressPerSecond));
update();
} void OvenTimer::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
int side = qMin(width(), height());
painter.setViewport( (width()-side)/2, (height()-side)/2, side, side );
painter.setWindow(-50, -50, 100, 100);
draw(&painter);
} void OvenTimer::draw(QPainter *painter)
{
static const int triangle[3][2]={ {-2,-49}, {+2,-49}, {0,-47} };
QPen thickPen(palette().foreground(), 1.5);
QPen thinPen(palette().foreground(), 0.5);
QColor niceBlue(150, 150, 200); painter->setPen(thinPen);
painter->setBrush(palette().foreground());
painter->drawPolygon( QPolygon(3, &triangle[0][0]) ); QConicalGradient coneGradient(0,0,-90.0);
coneGradient.setColorAt(0.0, Qt::darkGray);
coneGradient.setColorAt(0.2, niceBlue);
coneGradient.setColorAt(0.5, Qt::white);
coneGradient.setColorAt(1.0, Qt::darkGray);
painter->setBrush(coneGradient);
painter->drawEllipse(-46, -46, 92, 92); QRadialGradient haloGradient(0,0,20,0,0);
haloGradient.setColorAt(0.0, Qt::lightGray);
haloGradient.setColorAt(0.8, Qt::darkGray);
haloGradient.setColorAt(0.9, Qt::white);
haloGradient.setColorAt(1.0, Qt::black);
painter->setPen(Qt::NoPen);
painter->setBrush(haloGradient);
painter->drawEllipse(-20, -20, 40, 40); QLinearGradient knobGradient(-7, -25, 7, -25);
knobGradient.setColorAt(0.0, Qt::black);
knobGradient.setColorAt(0.2, niceBlue);
knobGradient.setColorAt(0.3, Qt::lightGray);
knobGradient.setColorAt(0.8, Qt::white);
knobGradient.setColorAt(1.0, Qt::black); painter->rotate(duration() * DegressPerSecond);
painter->setBrush(knobGradient);
painter->setPen(thinPen);
painter->drawRoundedRect(-7, -25, 14, 50, 99, 49); for( int i=0; i<=MaxMinutes; i++ )
{
if(i%5==0)
{
painter->setPen(thickPen);
painter->drawLine(0, -41, 0, -44);
painter->drawText(-15, -41, 30, 30,
Qt::AlignHCenter | Qt::AlignTop,QString::number(i));
}
else
{
painter->setPen(thinPen);
painter->drawLine(0, -42, 0, -44);
}
painter->rotate(-DegreesPerMinute);
} }
QT 使用QPainter 绘制图形 和 世界变换 world transform的更多相关文章
- Qt使用QPainter绘制矢量图并保存为svg文件
位图和矢量图: Bitmap: Usually a larger file size Cannot be enlarged into a higher resolution as the image ...
- PyQt5利用QPainter绘制各种图形
这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...
- 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
- Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解
前话 Qt的图形视图框架,最核心的三个类为:QGraphicsScene.QGraphicsItem与QGraphicsView. 基于图形框架的高级白板软件Demo QGraphicsSce ...
- QPainter绘制遇到的小问题
1.Qt绘图基础 (1)绘图需画笔和画布: QPainter 相当于Qt中的一个画笔,绘制时需要一块画布, Qt中扮演画布角色的组件为QPaintDevice和他的各个子类,如: QWidget, Q ...
- qt中窗口绘制——图片的绘制
在qt 中,QPixmap 用于表示一张图片,支持png,jpg格式的加载. QPixmap pm("c:/test.png"); 或者 QPixmap pm; pm.load(& ...
- Java 在PDF文档中绘制图形
本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...
- OpenGL学习进程(4)第二课:绘制图形
本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形: (1)用点的坐标来绘制矩形: #include <GL/glut.h> void display(void) ...
- 46.Qt 使用OpenGL绘制立方体
main.cpp #include <QApplication> #include <iostream> #include "vowelcube.h" in ...
随机推荐
- EasyNVR摄像机无插件直播流媒体服务器前端构建之输入框样式的调整
EasyNVR授权方式分为软件的授权和硬件授权两种方式,软件授权需要在软件输入永久邀请码可以激化永久授权 起初我们的界面设计是为了满足功能的需求就是 ,用户可以输入激活码提交,完成永久授权. 在实际的 ...
- isnull在order by中的使用——让我长见识了
select * from VisitLogorder by ISNULL(NextVisitDate,'2299-01-01') 此sql的作用是查找表中的数据,并按照NextVisitDate字段 ...
- On the fly test
on the fly test就是边开发边测试的意思.test code不是早就生成好的,在一边生成code的同时一边做test running,最大的好处是,flexiable ,每一次可以选择不同 ...
- crontab 问题分析 - CSDN博客 https://blog.csdn.net/tengdazhang770960436/article/details/50997297
cd /mnt/tools/trunk/plugins/personas; python update_keywords.py crontab 问题分析 crontab 问题分析 - CSDN博客 ...
- 比较运算符compareTo()、equals()、==之间的区别
前言 首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类): equals:是否同一个对象实例.注意,是 ...
- python并发编程&多线程(一)
本篇理论居多,实际操作见: python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...
- 001 unique string
以后坚持每一个星期都写记到算法题,不论简单还是难,纯熟娱乐! 描写叙述: 实现一个算法来推断一个字符串中的字符是否唯一(即没有反复).不能使用额外的数据结构. (即仅仅使用主要的数据结构) 代码: # ...
- Oracle 报 ORA-21561: OID generation failed 错误 mac 链接oracle
简单的说:在终端输入:sudo scutil --set HostName localhost
- (2)linux未使用eth0,未使用IPV4导致无法连接
首先ifconfig查看网络IP 看,我这里默认启用了2个网卡,一个是eth0,另一个是lo(基于loopback方式) 1.如果有eth0则做:界面修改 (1)输入命令setup,选择network ...
- ACM解题之(ZOJ 2724)Windows Message Queue
题目来源: 点击打开链接 题目翻译: 消息队列是windows系统的基本基础.对于每个进程,系统都维护一个消息队列.如果这个过程发生某些事情,例如鼠标点击,文本改变,系统会向队列添加一条消息.同时,如 ...