QT怎么画这个图??

Qcustom较轻量,只需要在project 中包含qcustomplot.h 和 qcustomplot.cpp 几乎就可以使用;相比Qcustom,qwt功能更为强大,但是它的安装十分麻烦。但是qwt只是对静态图表的表示非常不错,动态曲线性能并不突出。如果只是静态绘图,或者动态绘制的点并不多,继续用qwt甚至Qcustom完全没问题。

如果是新入手Qt绘图,用Qt charts显然是更好的选择,因为它在各方面都比前两者要好,并且也易于使用。
并且qml也支持charts,qml的渲染默认用GPU,成长性更好。
如果你在安装Qt的时候,选择了Qt charts部分,那么在Qt中使用charts 只需要 在 .pro文件中

进入主题: 动态实时折线图绘制,动态绘图,也就是说折线随着横坐标的增长而实时变化。从这一秒和上一秒的变化看来,就是坐标轴不动,整个图像往前移了一个单位,然后在空出的最后一个位置增加了一个新的点。从相对的角度来说,既然可以把图像往前移一个单位,当然也可以坐标轴往后移一个单位。

Qt有一个函数scroll可以实现后者的功能,它有两个参数,可以设置每次x、y轴向右和向上滚动的距离。

Qt charts中,可以主要一下几个类: QChart 和 QChartView,QChart是用什么画,差不多画笔的意思,QChartView是在什么上画,差不多画布的意思。

    由于公司产品界面都有统一色系的背景图片,所以所画的曲线图需要添加背景图片,添加背景图片很简单;

点击(此处)折叠或打开

添加背景图很顺利,可是添加后,再需要网上画线,费了两天时间,用了好多种方法都不显示,最后尝试不加载背景图时却可以看到直线。最后终于弄明白,如果需要往图片上画线等之类的操作,需要添加图片之前就要往图片上画线,之后加载背景图片就可以显示出来;

点击(此处)折叠或打开


paintevent 函数,只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它。这个事件处理器可以在子类中被重新实现来接收绘制事件。 它可以是repaint()或update()的结果。 很多窗口部件在当它们被请求时,它们很简单地重新绘制整个界面,但是一些窗口部件通过仅仅绘制被请求的区域QPaintEvent::region()进

Qt也可通过把多个绘制事件合并为一个来加快绘制速度。当update()被调用几次或者窗口系统发送几次绘制事件,Qt把它们合并为 一个比较大区域(请参考QRegion::unite())的一个事件中。repaint()不允许这样优化,所以只要可能我们尽量使用update ()。

当绘制事件发生,更新区域通常被擦除。这里有一些例外,通过QPaintEvent::erased()可以得知这个窗口部件是否被擦除。

Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter、QPainterDevice和

QT中Arthur绘图框架中的基本绘图元素是画笔,画刷。

QPainter类具有GUI程序需要的绝大多数函数,能够绘制基本图形(点,线,矩形,多边形等)以及复杂的图形(如绘图路径)。使用绘图路径(QPaintPath)的优点是复杂形状的图形只用生成一次,再使用的时候只需要调用QPainter::drawPath()就可以绘制。QPainterPath对象可以用来填充,绘制轮廓。

线和轮廓都可以用画笔(QPen)进行绘制,画刷(QBrush)进行填充。画笔定义风格(线形),宽度,笔尖画刷以及端点是如何绘制的(cap-style),端点的连接方式(join-style)。画刷用来填充画笔绘制的图形,可以定制不同的填充模式和颜色的画刷。

当绘制文字时,字体使用QFont类定义,Qt使用指定字体的属性,如果没有匹配的字体,Qt将使用最接近的字体。字体属性可以通过QFontInfo来获取。字体的度量(measurement)使用QFontMetrics类来获取。QFontDatabase类可以获得底层窗口系统所有可用的字体。

通常情况下QPainter以默认的坐标系统进行绘制,也可以用QMatrix类对坐标进行变换。

当绘制时,可以使用QPainter::SetRenderHint函数设置绘图引擎是否启用反锯齿功能使图变得平滑。

1、重写重绘事件处理函数实现绘图

基础部件类Qwidget提供的paintEvent函数,是纯虚函数;Qwidget的子类要使用paintEvent函数必须重新实现。在三种情况会发生重绘事件调用paintEvent函数:

A、当窗口部件第一次显示时,系统会自动产生一个绘图事件

C、当窗口部件被其他部件遮挡,然后又再次显示出来时,就会对隐藏的区域产生一个重绘事件

D、重新调整窗口大小时

2、通过事件过滤器实现重绘

绘图时需要先定义一个QPainter类对象,绘图工具可以使Qpen(画笔)和QBrush(画刷)。Qpen(画笔)来绘制轮廓线,QBrush(画刷)用来填充,使用QPen写文本时还可以指定字体(QFont类)。

画笔的属性包括线型,线宽,颜色等。

A、QPen主要成员函数如下:

画笔端点风格决定了线的端点样式,只对线宽大于1的线有效。Qt使用枚举定义了三种端点风格,分别为Qt::SqureCap,QT::FlatCap,Qt::RoundCap。

在Qt中图形使用QBrush进行填充,画刷包括填充颜色和填充模式(风格)。

在Qt中,颜色使用QColor类表示,QColor支持RGB,HSV,CMYK颜色模型。QColor还支持alpha混合的轮廓和填充。RGB是面向硬件的模型,颜色由红绿蓝三种基色混合而成;HSV模型比较符合人对颜色的感觉,由色调(0-359),饱和度(0-255),亮度(0-255)组成;CMYK由青,洋红,黄,黑四种基色组成,主要用于打印机等硬件拷贝设备上,每个颜色分量的取值是0-255。

填充模式通过枚举类型Qt::BrushStyle来实现,默认值是Qt::NoBrush,不进行任何填充;填充模式包括基本填充模式,渐变填充,和纹理填充模式。不同的填充模式显示效果如下:

线性渐变填充指定两个控制点,画刷在两个控制点之间进行颜色插值。通过创建QLinearGradient对象来设置画刷。

圆形渐变填充需要指定圆心,半径和焦点。画刷在焦点和圆上的所有点之间进行颜色插值,通过创建QRadialGradient对象设置画刷。

圆锥渐变填充指定圆心和开始角,画刷沿圆心逆时针对颜色进行插值,通过创建QConicalGradient对象并设置画刷。

level)可以设置窗口的透明度。但该属性和Alpha通道的原理并不相同,Qt4在Windows和Mac OS X平台上才支持该属性,但在X11平台上却需要Composite扩展才能工作。(alpha通道使用的是X11的xRender扩展)。

在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图。使用双缓冲,可以减轻绘制的闪烁感。在有些情况下,用户要关闭双缓冲,自己管理绘图。下面的语句设置了窗口部件的Qt::WA_PaintOnScreen属性 ,就关闭了窗口部件的双缓冲。

Qt4不再提供异或笔,组合模式QPainter::CompostionMode_Xor()并不是异或笔,Qt4只提供了QRubberBand实现矩形和直线的绘图反馈。要实现在绘图中动态反馈必须使用其他方法。程序中使用双缓冲来解决这个问题。在绘图过程中,一个缓冲区绘制临时内存,一个缓冲区保存绘制好的内容,最后进行合并。

在交互绘图过程中,程序将图像缓冲区复制到临时缓冲区,并在临时缓冲区上绘制,绘制完毕在将结果复制到图像缓冲区,如果没有交互复制,则直接将图像缓冲区绘制显示到屏幕上。

path)由基本图元(矩形,椭圆,直线,曲线)组成,绘图路径可以是闭合的路径,如矩形和圆,或者是非闭合的路径,如直线和曲线。绘图路径在Qt中使用QPainterPth类表示,提供了绘图操作的容器,可以使图形能够复用。绘图路径可以进行填充,显示轮廓和裁剪。要生成可填充的轮廓的绘图路径,可以使用QPainterPathStroker类。使用QPainterPath的优点是复杂的图形只需创建一次,就可以多次使用。QPainterPath对象可以是只有起点的空路径,或者从其他QPainterPath对象复制,创建了QPainterPath对象后,可以使用lineTo(),cubicTo(),quadTo() 函数将直线和曲线添加到路径中来,直线和曲线从currentPosition()开始绘制。currentPosition()总是返回最后的子路经绘制的终点。使用moveTo()函数可以在不增加路径的情况下移动currentPositon(),它关闭了一个子路经,开始一个新的子路经。

addText()将Qt的一些基本图元加入绘图路径。一个已有的绘图路径可以通过connectPath()函数加入到另一个绘图路径中。

Qt提供了两种填充方式,Qt::OddEventFill和Qt::WindingFill。Qt::OddEvent是默认的填充规则,指定QPainterPath使用奇偶填充规则,奇偶填充规则判断一个点是否在路径图形内的方法是从该点画一条水平线到路径外,计算水平线和路径的交点数,如果交点是奇数个则说明该点在路径图形内。QPainterPath还有一些函数可以获取路径信息,如elementAt()函数可以取出指定的子路经元素,isEmpty()函数判断当前路径是否为空。controlPointRect()函数返回路径中所有的点和控制点的矩形,controlPointRect函数运行速度比返回精确包容框boundingRect()函数快得多。contains()函数判断一个点或一个矩形是否在路径内。intersects()判断指定的矩形与路径是否相交。QPainterPath可以将矩形图形转换为其他图形,如使用toFillPolygon(),toFillPolygon(),toSubpathPOlygons()函数将路径转化为多边形。

使用线性渐变填充的文字路径实现代码:

QWidget是所有用户界面元素的基类,窗口部件是用户界面的原子元素,接受鼠标、键盘、窗口系统的其他事件并在屏幕上绘制自己。

QImage类提供了与硬件无关的图像表示,为直接操作像素提供优化,QImage支持单色、8-bit、32-bit和alpha混合图像,使用QImage的优点在于可以获得平台无关的绘制操作,同时图像可以不必在GUI线程中处理。

QPixmap是后台显示的图像,为在屏幕上显示图像提供优化,不同于QImage,QPixmap的图像数据用户不可见,由底层窗口系统管理,为了优化QPixmap图像,Qt提供了QPixmapCache类来存储临时的pixmap。Qt还提供了QPixmap的继承类QBitmap类,QBitmap表示单色的pixmap,主要用来创建自定义的QCursor和QBrush对象,构造QRegion对象,设置pixmap和窗口部件的掩码。

主要的绘图成员函数如下:

设置好画笔、画刷就可以使用绘图函数进行绘图。

我要回帖

更多关于 结构图怎么画 的文章

 

随机推荐