Qt绘图
来源:互联网 发布:淘宝和京东价格不一样 编辑:程序博客网 时间:2024/04/30 22:55
本文大部分内容来自于Qt5.5.1的API文档。
Qt的绘图系统允许使用相同的API在屏幕和其他打印设备上进行绘制。整个绘图系统基于QPainter,QPaintDevice和QPaintEngine三个类。
QPainter用来执行绘制操作;QPaintDevice是一个二维空间抽象,这个二维空间允许QPainter在上面进行绘制,也就是QPainter的工作空间;QPaintEngine提供了画笔在不同的设备上进行绘制的统一借口。QPaintEngine类应用于QPainter和QPaintDevice,对于开发人员来说一般是透明的,除非你要自定义一个设备,否则不用关心QPaintEngine类。我们可以把QPainter理解成画笔,把QPaintDevice理解成绘制的画纸。QPaintEngine就是让不同的纸张、屏幕可以使用相同的画笔的类。
我们看一个例子:
//paintwidget.h#ifndef PAINTWIDGET_H#define PAINTWIDGET_H#include <QWidget>#include <QPaintEvent>#include <QPainter>class PaintWidget : public QWidget{ Q_OBJECTpublic: PaintWidget(QWidget *parent = 0); ~PaintWidget();private: void paintEvent(QPaintEvent *);};#endif // PAINTWIDGET_H
//paintwidget.cpp#include "paintwidget.h"PaintWidget::PaintWidget(QWidget *parent) : QWidget(parent){ resize(800, 600); setWindowTitle("Paint Demo");}void PaintWidget::paintEvent(QPaintEvent *){ QPainter painter(this); painter.drawLine(80, 100, 650, 500); painter.setPen(Qt::red); painter.drawRect(10, 10, 100, 400); painter.setPen(QPen(Qt::green, 5)); painter.setBrush(Qt::blue); painter.drawEllipse(50, 150, 400, 200); painter.save();}PaintWidget::~PaintWidget(){}
//main.cpp#include "paintwidget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); PaintWidget w; w.show(); return a.exec();}
代码在paintEvent中创建了一个QPainter对象,每次运行paintEvent时都会创建一个QPainter,这样其实是有问题的,因为QPainter都会被设置。如果设置出现不一致,则会出现屏幕闪动。QPainter对象在需要多次调用不同设置的画笔时,可以使用save()将状态保存下来,后面再使用restore()恢复。一般可以把QPainter作为需要绘制的类的私有成员,这样方便调用。
paintEvent()是QWidget本身具有的一个virtual protected函数,所以我们可以在子类中重写这个函数。那么paintEvent()是什么时候被调用的呢?Qt文档中描述有三条:1)repaint()或者update()被调用的时候。这样我们可以主动更新界面。2)被其他界面挡住后又恢复过来的时候。比如我们windows中运行上面的代码,在被其他窗口覆盖时会运行一次,然后在此窗口被激活时又会运行一次。
QPainter有两个构造函数,
QPainter::QPainter()QPainter::QPainter(QPaintDevice * device)
如果使用第一个方法构造,则需要在后面指定绘图设备,如:
void MyWidget::paintEvent(QPaintEvent *){ QPainter p; p.begin(this); p.drawLine(...); // drawing code p.end();}
QPainter可以画很多几何图形,一般都是调用以draw开头的函数,具体可以参考API。
QPainter在绘制时按照程序运行的顺序进行绘制,如果出现重叠,则后面绘制的会把前面的覆盖掉。
QPainter可以使用setPen指定画笔,它有三个重载:
void QPainter::setPen(const QPen & pen);void QPainter::setPen(const QColor & color);void QPainter::setPen(Qt::PenStyle style);
画笔的主要功能是勾勒轮廓线,如果要填充,则需要使用QBrush–画刷。
QBrush定义了QPainter的填充模式,具有样式、颜色、纹理等特性。画刷的style()定义了填充样式,可以使用Qt::BrushStyle枚举,默认是Qt::NoBrush。具体枚举有:
画刷的color()可以返回一个当前使用的颜色,setColor()可以设置颜色。画刷的gradient()定义了渐变填充。这个属性只有在填充样式是QLinearGradient, QConicalGradient, 和QRadialGradient或者是继承自QGradient的。如Qt提供的一个例子:
QRadialGradient gradient(50, 50, 50, 50, 50); gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1)); gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0)); QBrush brush(gradient);
当画刷样式是Qt::texturePattern时,texture()定义了用于填充的纹理。即使没有设置样式为Qt::texturePattern,当调用setTexture是,QBrush会自动将style()设置为Qt::texturePattern.
- QT绘图
- Qt 绘图
- Qt 绘图
- qt 绘图
- Qt绘图
- qt绘图
- qt绘图
- Qt绘图
- Qt 绘图
- QT绘图系统
- Qt坐标绘图
- Qt OpenGL三维绘图
- qt 双缓冲绘图
- QT笔记之绘图
- Qt 双缓冲绘图
- Qt 双缓冲绘图
- 2D绘图 (Qt)
- Qt QPainter绘图原理
- android camera HAL: 请求的创建和提交
- 【JavaScript】模块化写法总结
- HDU 2601:An easy problem【数学】
- 关于codeforces比赛规则介绍(转载)
- SQlite存储
- Qt绘图
- restlet Framework2.2和2.3版本的对比
- Linux学习
- 设置常量的解决方案
- @property与@synthesize的区别
- 85.Count Primes
- Linux ALSA声卡驱动之一:ALSA架构简介
- 名词解释之人身保险概论
- 类是如何实例化为对象的