绘图系统
QPainter 绘图操作的类,绘图设备一般包括Qwidget、Qpixmap、QImage.他们提供给QPainter画布。
从QWidget类继承的类都有paintEvent()事件,该函数是虚函数,重写该函数。 相当于windows mfc的onpaint函数。
只要窗口部件需要被重绘就被调用。是repaint()或update()的结果。 几次调用update()的结果通常仅仅是一次paintEvent()调用。 Qt通常在paintEvent()调用之前擦除这个窗口部件的区域。
update()相当于 mfc 的invalidate();迫使paintEvent虚函数被调用。
设置qwidget窗口大小的函数
1.setMinimumSize setMaximumSize
2.resize
3.setFixedSize
物理坐标:即视口,viewport() 单位是像素
setviewport();
逻辑坐标:即窗口, window()
setwindow() ;
正常的情况画图:
1.先定义一个视口,即物理坐标。//得到真实的大小
2,然后定义窗口。//可以按比例缩放
QPixmap
QPixmap类用于绘图设备的图像显示,它可以作为一个QPaintDevice对象,也可以加载到一个控件中,通常是标签或按钮,用于在标签或按钮上显示图像。
QPixmap可以读取的图像文件类型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。
可以直接使用构造函数,关联资源 ,如 QPixmap(":/res/python.jpg");
load() | 加载图像文件作为QPixmap对象 |
save() | 将QPixmap对象保存为文件 |
QImage
QImage的基本函数的使用与QPixmap类似,可以直接使用构造函数,关联资源
QImage 转
QPixmap
image=
new
QImage(
"D:/Temp/XX.jpg"
);
pixmap=newQPixmap();
pixmap->convertFromImage(*image);
QPainter 重要的属性
1.pen属性:Qpen对象,控制线条的颜色、宽度、线性。
void setPen(const QPen &pen);
const QPen &pen() const;
2.brush属性:QBrush,区域填充特性,填充的颜色、方式、渐变。
void setBrush(const QBrush &brush);
const QBrush &brush() const;
3.font属性:QFont对象,文字的字体样式、大小等。
void setFont(const QFont &f);
const QFont &font() const;
画图
绘图坐标系统的单位是像素。左上角的坐标是(0,0)。
物理坐标,即是视口坐标(viewport)
逻辑坐标,即是窗口坐标(window)
获取绘图区的区域
宽度:inline int width() const;
高度:inline int height() const;
1.画点
inline void drawPoint(int x, int y);
2.画线
inline void drawLine(const QPoint &p1, const QPoint &p2);
在画直线的还可以使用QPainterPath。
QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。
绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线
3.画由QPainterPath定义的路线
void drawPath(const QPainterPath &path);
4.画pixmap图片
inline void drawPixmap(const QRect &r, const QPixmap &pm);
5.画矩形
inline void drawRect(const QRect &rect);
6.画文本
void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());
7.填充
void fillRect(const QRect &, const QColor &color);
8.绘制图片
drawImage(const QRect &r, const QImage &image);
坐标变换函数 //坐标变换 属于从物理坐标 转换成 逻辑坐标
1.平移 inline void translate(qreal dx, qreal dy); //单位是像素
2.旋转 void rotate(qreal a); //单位是度,正数为 顺时针,负数为逆时针
3.缩放 void scale(qreal sx, qreal sy); 大于1放大,小于1缩放
4.保存当前状态:void save(); //先保存当前状态,再做坐标变换,最后恢复上一次状态。
5.恢复上一次的状态:void restore();
6.复位:void resetTransform();
视口和窗口坐标
视口坐标
设置视口坐标 (物理坐标) //基于物理坐标,默认一般以左上角为原点(0,0)
void setViewport(const QRect &viewport);
或inline void setViewport(int x, int y, int w, int h);
(x,y)为视口的起点,其起点值还是根据widget的左上角的坐标作为原点(0,0)算起。
窗口坐标(逻辑坐标) //具有逻辑坐标,而不能再看物理的坐标,其起点不再是以坐上角(0,0)为原点
void setWindow(const QRect &window);
或inline void setWindow(int x, int y, int w, int h);
(x,y)为窗口坐标的左上角的坐标, 不再是以widget的左上角的坐标作为(0,0)算起。
(0,0)可以是根据自己实际情况设定的某一位置。是在视口坐标的基础上,根据自己的要求,划分设定视口坐标。
窗口坐标的优点:只需按照窗口坐标定义来画图,而不用管实际的物理坐标范围的大小。
这样当实际设备大小变化时,绘制图形自动变化大小。这样,是绘图与设备隔离开来。适用不同的设备,大小。
延伸:
两种自定义绘制元素:
- The traditional for Qt way using QPainter (QQuickPaintedItem). (传统的方式是使用QPainter/QQuickPaintedItem来绘制界面)
- The common QML way using QQuickItem and OpenGL functionality. (QML一般使用QQuickItem和OpenGL函数来绘制界面)
第一种方式似乎比较容易实现,如果我们使用第二种方式绘制界面元素时,它们的运行效率会更快。