qt 绘图

绘图系统

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函数来绘制界面)

第一种方式似乎比较容易实现,如果我们使用第二种方式绘制界面元素时,它们的运行效率会更快。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值