论文部分内容阅读
摘要:为提高开发效率,降低列车显示器软件开发成本,本文设计了一种基于Linux Qt平台的显示器表盘控件。在Qt4开发环境下,通过继承QWidget类,将QLinearGradient类、QPainter类、QLabel类等结合,经过坐标变换及旋转函数,重新实现paintEvent函数,实现此表盘控件。经过实际项目验证,该控件类设计友好、个性化程度较高,丰富了传统列车显示界面。
Abstract: In order to improve the development efficiency and reduce the development cost of train display software, this paper designs a display dial control based on Linux Qt platform. In the Qt4 development environment, the QWidget class is inherited to combine the QLinearGradient class, QPainter class, QLabel class, etc. After coordinate transformation and rotation function, the paintEvent function is re-implemented to realize the dial control. Through the actual project verification, the control class is friendly in design, highly personalized, and enriches the traditional train display interface.
关键词:Qt框架;表盘控件类;C++;Linux系统;人机界面
0 引言
列车人机界面(Human Machine Interface,HMI)在列车运行过程中向司机及维护人员提供列车的运行信息、列车各系统设备状态信息及故障信息等,是列車网络控制及监控系统的重要组成部分[1]。伴随着信息技术的飞速发展及轨道交通设备性能的提升,带有触摸屏控制的显示器逐步取代了传统的仪表显示方式,其种类及功能也变得更加多样化和丰富,操作上的方便灵活、显示直观的优势日益凸显。
HMI系统以微机技术为核心,与数据处理技术、GUI等技术相结合,软件开发复杂,专用性强,扩展性不强。本文设计的一种基于Linux Qt平台的显示器表盘控件,以嵌入式Linux内核2.6.x系统为软件平台,在此基础上采用开源图形界面库Qt4.8.5、开发工具QtCreator2.8.0开发HMI界面控件类。该表盘控件类、引用方便,可靠性高、使显示器界面程序开发模块化,降低了系统开发复杂度及开发成本。
1 Qt框架介绍
Qt框架结构如图1所示。
1.1 GUI库
Qt本身是一个跨平台的C++图形用户界面库,为诺基亚旗下的编程语言工具[2]。随着用户的增加及发展,已经成为一种独立的软件开发平台,包括Qt、基于Frame—Buffer的Qtopia Core、快速开发工具Qt Designer和国际化工具Qt Linguist等部分。Qt支持的系统有:Unix系统、Linux系统、WinNT/Win2k、Windows 95/98、Mac OS等平台。Qt的C++类库同Windows平台上的MFC、OWL、VCL是同类型的。但Qt还具有下列优点:
①支持跨平台运行。
Qt支持下列操作系统:Windows NT、Linux、Unix、Mac OS、HP—UX、FreeBSD等。
②丰富的API。
Qt包括多达250个以上的C++类,还提供了基于模板的collections、serialization、file、device、di—rectory management和date/time类,甚至还包括正则表达式的处理功能。
③面向对象的程序设计。
Qt具有良好封装机制,这使得Qt的模块化程度非常高,可重用性好,对于用户开发方便、快捷。Qt使用一种信号/槽一(signals/slots)的机制,使得各个对象之间的协同工作变得十分简单。
④支持2D/3D图形渲染,支持OpenGL。
⑤大量的开发文档。
1.2 Qt的信号槽机制
嵌入式Linux操作系统沿袭了Unix系统的架构,具有成熟、可靠、稳定等特点;Linux是开源的操作系统,因此任何系统的设计者均可以根据实际需求对其进行二次开发,只保留相关操作系统功能,同时可根据实际应用的需要优化操作系统的代码,体系结构灵活,易于裁剪,免费使用等特点,使其成为嵌入式系统开发的重要工具[3]。
创建自定义的窗口部件方法有:
对一个已经存在的Qt窗口部件进行子类化;
将QWidget类与现有窗口部件类进行组合,重新实现虚函数;
子类化QWidget,并且通过重新实现一些用来绘制窗口部件及响应鼠标点击的事件处理器;
由于Qt未提供表盘控件类,且无法通过Qt提供的控件组合实现,因此只能采用第三种方法即直接对QWidget进行子类化,然后通过QPainter在QWidget窗口部件上进行绘制此表盘控件,同时添加部件响应事件。另外,将自绘制好的表盘控件集成到Qt设计师中,这样就可以像使用内置的Qt窗口部件一样来使用了。
通过此种方法创建的表盘控件可实现跨平台。 Qt的二维图形引擎是基于QPainter类。QPainter既可以绘制几何性状如点、线、矩形、椭圆、弧形、弦形、饼形等,也可以绘制像素映射、图像和文字。此外,QPainter还支持高级特性如反走样、像素混合、渐变填充、矢量路径等。
QPainter可以在“绘图设备”上进行画图,如QWidget、QPixmap、QImage等。通过重新实现QWidget::paintEvent()函数,即可在窗口部件上随心所欲的控制所要绘制的部件的外观、形状等。
1.3 坐标系介绍
Qt中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位增减。
1.3.1 坐标系变换
坐标系变换是利用变换矩阵来进行的,可以利用QTransform类来设置变换矩阵,因为一般不需要进行更改,所以这里就不再涉及。下面只是对坐标系的平移、缩放、旋转、扭曲等函数进行介绍。
利用函数void QPainter::translate(qreal dx,qreal dy)实现平移。
利用函数void QPainter::scale(qreal sx,qreal sy)实现缩放。
利用函数void QPainter::rotate(qreal angle)实现旋转。
1.3.2 坐标系统的保护
平移函数、旋转函数已经将坐标系进行了变换,所以需要将变换的坐标系再恢复,要用到两个函数:
Void QPainter::save() 保存坐标系现在的状态;
Void QPainter::restore() 恢复以前的坐标系。
可以利用save()函数保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore ()将以前的坐标系状态进行恢复,其实是一个入栈和出栈的操作。
2 表盘控件类的设计与实现
本设计将QWidget作为父对象,定义了用于有关表盘属性的相关变量如下:
2.1 表盘头文件(adwidget.h)介绍
头文件中需要加载如图2所示的类:
在ADWidget类中使用Q_PROPERTY()宏声明了自定义属性:
arcLineColor,每个属性都有一个数据类型、一个“读”函数和一个作为可选项的“写”函数。
在Qt Designer工具中使用窗口部件时,在属性编辑器里的QWidget属性下会显示这些自定义的属性。这些属性可以是有QVariant所支持的任何类型。
ADWidget.h包含其私有函数和私有变量。这些私有变量保存这“写”属性的值。颜色数据保存在私有变量中,可以通过setArcLineColor()和arcLineColor()函数对它们进行访问。
2.2 表盘控件类的构造函数和类方法
类的方法在ADWidget.h的文件中定义,ADWidget.cpp文件中实现其所有方法的定义。
2.2.1 构造函数
构造函数中初始化所有私有变量及赋初值。并定义QPainter的对象,设置其相关属性;定义画表盘的刻度的画笔并设置画笔的颜色、粗细等属性;同时定义设置画表盘指针相关属性和坐标,设置指针的颜色。
2.2.2 重载paintEvent函数
当表盘窗口发生变化或模拟量数值发生变化时,自动调用此函数重新实现画线、等相关操作。在paintEvent函数中调用QPainter的对象函数实现画线、画弧、画数字等操作。
在设定的区域矩形区域内画圆弧,圆弧半径为m_circleRadius(default:140),以(150,150)为中心点画;
painter.rotate(a);是以给定的角度(正 顺时针/ 负 逆时针)旋转坐标系;通过调用painter.save(),将坐标系进行保存;调用painter.restore()恢复之前的坐标系;
计算-135°位置处的坐标起始点,根据角度关系,算出刻度的坐标终点;通過旋转可获得所有刻度。
表盘的指针从-180°处计算,根据指针定义大小,确定指针起始坐标及中间坐标点,如图3所示。
3 表盘实现效果
表盘类在main函数定义对象,并运行后实现的效果如图4所示。
4 结论
本文设计了一种基于Linux Qt开发工具的列车表盘控件,此控件能够满足数据显示的需要,尤其是车辆速度的显示。此控件继承了Qt框架提供的QWidgt类,利用 QLinearGradient类、QPainter类、QLabel等类,通过坐标变换函数及旋转函数,实现指针的旋转操作;通过重新实载paintEvent函数,实现控件的实时显示。同时,可将此控件集成到QDesigner工具中,丰富了原有控件库。经过实际项目验证,该控件类设计友好、个性化程度较高,能满足客户需求。
参考文献:
[1]闫锋欣,曾泉人,张志强译.Jasmin Blanchette, Mark Summe
dield.C++GUI Qt4编程(第2版)[M].北京:电子工业出版社,201l:2-4.
[2]彭均键,史步海,刘洋.基于Qt的嵌入式GUI开发平台的搭建[J].微型电脑应用2010,26(02):1-3.
[3]陈孝文,陈蜀宇,马同杰.基于Linux的嵌入式图形用户界面的研究与应用[J].计算机系统应用[J].2009:1-2.
Abstract: In order to improve the development efficiency and reduce the development cost of train display software, this paper designs a display dial control based on Linux Qt platform. In the Qt4 development environment, the QWidget class is inherited to combine the QLinearGradient class, QPainter class, QLabel class, etc. After coordinate transformation and rotation function, the paintEvent function is re-implemented to realize the dial control. Through the actual project verification, the control class is friendly in design, highly personalized, and enriches the traditional train display interface.
关键词:Qt框架;表盘控件类;C++;Linux系统;人机界面
0 引言
列车人机界面(Human Machine Interface,HMI)在列车运行过程中向司机及维护人员提供列车的运行信息、列车各系统设备状态信息及故障信息等,是列車网络控制及监控系统的重要组成部分[1]。伴随着信息技术的飞速发展及轨道交通设备性能的提升,带有触摸屏控制的显示器逐步取代了传统的仪表显示方式,其种类及功能也变得更加多样化和丰富,操作上的方便灵活、显示直观的优势日益凸显。
HMI系统以微机技术为核心,与数据处理技术、GUI等技术相结合,软件开发复杂,专用性强,扩展性不强。本文设计的一种基于Linux Qt平台的显示器表盘控件,以嵌入式Linux内核2.6.x系统为软件平台,在此基础上采用开源图形界面库Qt4.8.5、开发工具QtCreator2.8.0开发HMI界面控件类。该表盘控件类、引用方便,可靠性高、使显示器界面程序开发模块化,降低了系统开发复杂度及开发成本。
1 Qt框架介绍
Qt框架结构如图1所示。
1.1 GUI库
Qt本身是一个跨平台的C++图形用户界面库,为诺基亚旗下的编程语言工具[2]。随着用户的增加及发展,已经成为一种独立的软件开发平台,包括Qt、基于Frame—Buffer的Qtopia Core、快速开发工具Qt Designer和国际化工具Qt Linguist等部分。Qt支持的系统有:Unix系统、Linux系统、WinNT/Win2k、Windows 95/98、Mac OS等平台。Qt的C++类库同Windows平台上的MFC、OWL、VCL是同类型的。但Qt还具有下列优点:
①支持跨平台运行。
Qt支持下列操作系统:Windows NT、Linux、Unix、Mac OS、HP—UX、FreeBSD等。
②丰富的API。
Qt包括多达250个以上的C++类,还提供了基于模板的collections、serialization、file、device、di—rectory management和date/time类,甚至还包括正则表达式的处理功能。
③面向对象的程序设计。
Qt具有良好封装机制,这使得Qt的模块化程度非常高,可重用性好,对于用户开发方便、快捷。Qt使用一种信号/槽一(signals/slots)的机制,使得各个对象之间的协同工作变得十分简单。
④支持2D/3D图形渲染,支持OpenGL。
⑤大量的开发文档。
1.2 Qt的信号槽机制
嵌入式Linux操作系统沿袭了Unix系统的架构,具有成熟、可靠、稳定等特点;Linux是开源的操作系统,因此任何系统的设计者均可以根据实际需求对其进行二次开发,只保留相关操作系统功能,同时可根据实际应用的需要优化操作系统的代码,体系结构灵活,易于裁剪,免费使用等特点,使其成为嵌入式系统开发的重要工具[3]。
创建自定义的窗口部件方法有:
对一个已经存在的Qt窗口部件进行子类化;
将QWidget类与现有窗口部件类进行组合,重新实现虚函数;
子类化QWidget,并且通过重新实现一些用来绘制窗口部件及响应鼠标点击的事件处理器;
由于Qt未提供表盘控件类,且无法通过Qt提供的控件组合实现,因此只能采用第三种方法即直接对QWidget进行子类化,然后通过QPainter在QWidget窗口部件上进行绘制此表盘控件,同时添加部件响应事件。另外,将自绘制好的表盘控件集成到Qt设计师中,这样就可以像使用内置的Qt窗口部件一样来使用了。
通过此种方法创建的表盘控件可实现跨平台。 Qt的二维图形引擎是基于QPainter类。QPainter既可以绘制几何性状如点、线、矩形、椭圆、弧形、弦形、饼形等,也可以绘制像素映射、图像和文字。此外,QPainter还支持高级特性如反走样、像素混合、渐变填充、矢量路径等。
QPainter可以在“绘图设备”上进行画图,如QWidget、QPixmap、QImage等。通过重新实现QWidget::paintEvent()函数,即可在窗口部件上随心所欲的控制所要绘制的部件的外观、形状等。
1.3 坐标系介绍
Qt中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位增减。
1.3.1 坐标系变换
坐标系变换是利用变换矩阵来进行的,可以利用QTransform类来设置变换矩阵,因为一般不需要进行更改,所以这里就不再涉及。下面只是对坐标系的平移、缩放、旋转、扭曲等函数进行介绍。
利用函数void QPainter::translate(qreal dx,qreal dy)实现平移。
利用函数void QPainter::scale(qreal sx,qreal sy)实现缩放。
利用函数void QPainter::rotate(qreal angle)实现旋转。
1.3.2 坐标系统的保护
平移函数、旋转函数已经将坐标系进行了变换,所以需要将变换的坐标系再恢复,要用到两个函数:
Void QPainter::save() 保存坐标系现在的状态;
Void QPainter::restore() 恢复以前的坐标系。
可以利用save()函数保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore ()将以前的坐标系状态进行恢复,其实是一个入栈和出栈的操作。
2 表盘控件类的设计与实现
本设计将QWidget作为父对象,定义了用于有关表盘属性的相关变量如下:
2.1 表盘头文件(adwidget.h)介绍
头文件中需要加载如图2所示的类:
在ADWidget类中使用Q_PROPERTY()宏声明了自定义属性:
arcLineColor,每个属性都有一个数据类型、一个“读”函数和一个作为可选项的“写”函数。
在Qt Designer工具中使用窗口部件时,在属性编辑器里的QWidget属性下会显示这些自定义的属性。这些属性可以是有QVariant所支持的任何类型。
ADWidget.h包含其私有函数和私有变量。这些私有变量保存这“写”属性的值。颜色数据保存在私有变量中,可以通过setArcLineColor()和arcLineColor()函数对它们进行访问。
2.2 表盘控件类的构造函数和类方法
类的方法在ADWidget.h的文件中定义,ADWidget.cpp文件中实现其所有方法的定义。
2.2.1 构造函数
构造函数中初始化所有私有变量及赋初值。并定义QPainter的对象,设置其相关属性;定义画表盘的刻度的画笔并设置画笔的颜色、粗细等属性;同时定义设置画表盘指针相关属性和坐标,设置指针的颜色。
2.2.2 重载paintEvent函数
当表盘窗口发生变化或模拟量数值发生变化时,自动调用此函数重新实现画线、等相关操作。在paintEvent函数中调用QPainter的对象函数实现画线、画弧、画数字等操作。
在设定的区域矩形区域内画圆弧,圆弧半径为m_circleRadius(default:140),以(150,150)为中心点画;
painter.rotate(a);是以给定的角度(正 顺时针/ 负 逆时针)旋转坐标系;通过调用painter.save(),将坐标系进行保存;调用painter.restore()恢复之前的坐标系;
计算-135°位置处的坐标起始点,根据角度关系,算出刻度的坐标终点;通過旋转可获得所有刻度。
表盘的指针从-180°处计算,根据指针定义大小,确定指针起始坐标及中间坐标点,如图3所示。
3 表盘实现效果
表盘类在main函数定义对象,并运行后实现的效果如图4所示。
4 结论
本文设计了一种基于Linux Qt开发工具的列车表盘控件,此控件能够满足数据显示的需要,尤其是车辆速度的显示。此控件继承了Qt框架提供的QWidgt类,利用 QLinearGradient类、QPainter类、QLabel等类,通过坐标变换函数及旋转函数,实现指针的旋转操作;通过重新实载paintEvent函数,实现控件的实时显示。同时,可将此控件集成到QDesigner工具中,丰富了原有控件库。经过实际项目验证,该控件类设计友好、个性化程度较高,能满足客户需求。
参考文献:
[1]闫锋欣,曾泉人,张志强译.Jasmin Blanchette, Mark Summe
dield.C++GUI Qt4编程(第2版)[M].北京:电子工业出版社,201l:2-4.
[2]彭均键,史步海,刘洋.基于Qt的嵌入式GUI开发平台的搭建[J].微型电脑应用2010,26(02):1-3.
[3]陈孝文,陈蜀宇,马同杰.基于Linux的嵌入式图形用户界面的研究与应用[J].计算机系统应用[J].2009:1-2.