一,QPainter绘图
Qt里的所有绘图,比如一个按钮和一个Label的显示,都有绘图系统来执行。绘图系统基于 QPainter、QPaintDevice和QPainEngine类。QPainter是可以直接用来操作绘图的类,而 QPaintDevice和QPainEngine都比QPainter更底层,我们只需要了解一下QPaintDevice和 QPainEngine就行了,用下面一张图来表示它们的关系。
用于显示的类,如Widget/QPixmap/QImage/Qlabel等可视类控件都可以充当绘图区域的“画布”,从 QWidget继承的类都有virtual void paintEvent(QPaintEvent *event)属性。paintEvent()是一个虚函数,它在qwidget.h头文件的protected修饰符下面。paintEvent()事件可以被重写。在绘图事件处理函数中创建QPainter对象,然后使用这个QPainter在绘图设备上绘制
void MainWindow::paintEvent(QPaintEvent *event)
{
//创建与绘制设备关联的对象QPainter;指定画图的对象,this代表本Widget
QPainter painter(this);
//绘制图形,先创建一个画笔,设置颜色等,然后在窗口中心绘制文本"subomb"
painter.setPen(Qt::red);
painter.drawText(rect(), Qt::AlignCenter, "subomb"); //绘制文本
}
1,颜色
Qt 中的任何颜色都由支持RGB,HSV和CMYK颜色模型的QColor类表示。通常使用QColor
RGB(R,G,B) 来指定颜色。QColor还支持alpha混合轮廓和填充(指定透明效果),并且该类与平台和设备无关(使用QColormap类将颜色映射到硬件)。QColorConstants命名空间中有20个预定义的QColor对象,包括黑色,白色,原色和辅助色。
// Specify semi-transparent red
painter.setBrush(QColor(255, 0, 0, 127));
painter.drawRect(0, 0, width()/2, height());
// Specify semi-transparent blue
painter.setBrush(QColor(0, 0, 255, 127));
painter.drawRect(0, 0, width(), height()/2);
2,窗口和视口
在使用QPainter进行绘制时,我们使用逻辑坐标指定点,然后将其转换为绘画设备的物理坐标,也就是可以通过窗口和视口来设置组件大小位置。视口是基于QPaintDevice类组件坐标实现,是物理坐标,可以通过setViewport()函数设置;窗口是基于自身的逻辑坐标,不是真实坐标,可以通过setWindow()函数设置。 逻辑坐标到物理坐标的映射由QPainter的world transformation worldTransform()以及QPainter 的viewport()和window()处理。视口表示指定任意矩形的物理标。“窗口”在逻辑坐标中描述相同的矩形。默认情况下,逻辑坐标系和物理坐标系重合,相当于绘制设备的矩形。
3,坐标
x轴y轴组成的平面坐标系来限定2D绘图,Qt中坐标系由QPainter类控制。
二,Qt Charts绘表
Qt Charts很容易绘制我们常见的曲线图、折线图、柱状图和饼状图等图表。不用自己花精力去了解第三方组件的使用了或者开发第三方组件。Qt的帮助文档里已经有说明Qt Charts主要部件的使用方法。可以点击Ctrl + Shift + T,查询相应类的继承关系。在项目里使用 Qt Charts 模块,需在pro文件添加:QT +=charts。在头文件处加上:QT_CHARTS_USE_NAMESPACE。或者,在头文件类外加上:using namespace QtCharts;
三,QCustomplot绘曲线图
1,将qcustomplot.c qcustomplot.h文件导入项目文件夹,在工程文件加入 QT += printsupport
2,在QT 设计师界面,在主窗口加入一个Widget组件,并右键选中,选中 提升为...,添加QCustomPlot类。编译运行,即可出现默认的坐标系。在主函数文件当中,可以实验ui->widget去访问qcustomplot对象