国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Linux Qt的列車(chē)顯示器表盤(pán)控件設(shè)計(jì)與實(shí)現(xiàn)

2021-09-10 07:22周忠洋
內(nèi)燃機(jī)與配件 2021年4期
關(guān)鍵詞:人機(jī)界面

周忠洋

摘要:為提高開(kāi)發(fā)效率,降低列車(chē)顯示器軟件開(kāi)發(fā)成本,本文設(shè)計(jì)了一種基于Linux Qt平臺(tái)的顯示器表盤(pán)控件。在Qt4開(kāi)發(fā)環(huán)境下,通過(guò)繼承QWidget類(lèi),將QLinearGradient類(lèi)、QPainter類(lèi)、QLabel類(lèi)等結(jié)合,經(jīng)過(guò)坐標(biāo)變換及旋轉(zhuǎn)函數(shù),重新實(shí)現(xiàn)paintEvent函數(shù),實(shí)現(xiàn)此表盤(pán)控件。經(jīng)過(guò)實(shí)際項(xiàng)目驗(yàn)證,該控件類(lèi)設(shè)計(jì)友好、個(gè)性化程度較高,豐富了傳統(tǒng)列車(chē)顯示界面。

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.

關(guān)鍵詞:Qt框架;表盤(pán)控件類(lèi);C++;Linux系統(tǒng);人機(jī)界面

0? 引言

列車(chē)人機(jī)界面(Human Machine Interface,HMI)在列車(chē)運(yùn)行過(guò)程中向司機(jī)及維護(hù)人員提供列車(chē)的運(yùn)行信息、列車(chē)各系統(tǒng)設(shè)備狀態(tài)信息及故障信息等,是列車(chē)網(wǎng)絡(luò)控制及監(jiān)控系統(tǒng)的重要組成部分[1]。伴隨著信息技術(shù)的飛速發(fā)展及軌道交通設(shè)備性能的提升,帶有觸摸屏控制的顯示器逐步取代了傳統(tǒng)的儀表顯示方式,其種類(lèi)及功能也變得更加多樣化和豐富,操作上的方便靈活、顯示直觀的優(yōu)勢(shì)日益凸顯。

HMI系統(tǒng)以微機(jī)技術(shù)為核心,與數(shù)據(jù)處理技術(shù)、GUI等技術(shù)相結(jié)合,軟件開(kāi)發(fā)復(fù)雜,專(zhuān)用性強(qiáng),擴(kuò)展性不強(qiáng)。本文設(shè)計(jì)的一種基于Linux Qt平臺(tái)的顯示器表盤(pán)控件,以嵌入式Linux內(nèi)核2.6.x系統(tǒng)為軟件平臺(tái),在此基礎(chǔ)上采用開(kāi)源圖形界面庫(kù)Qt4.8.5、開(kāi)發(fā)工具QtCreator2.8.0開(kāi)發(fā)HMI界面控件類(lèi)。該表盤(pán)控件類(lèi)、引用方便,可靠性高、使顯示器界面程序開(kāi)發(fā)模塊化,降低了系統(tǒng)開(kāi)發(fā)復(fù)雜度及開(kāi)發(fā)成本。

1? Qt框架介紹

Qt框架結(jié)構(gòu)如圖1所示。

1.1 GUI庫(kù)

Qt本身是一個(gè)跨平臺(tái)的C++圖形用戶(hù)界面庫(kù),為諾基亞旗下的編程語(yǔ)言工具[2]。隨著用戶(hù)的增加及發(fā)展,已經(jīng)成為一種獨(dú)立的軟件開(kāi)發(fā)平臺(tái),包括Qt、基于Frame—Buffer的Qtopia Core、快速開(kāi)發(fā)工具Qt Designer和國(guó)際化工具Qt Linguist等部分。Qt支持的系統(tǒng)有:Unix系統(tǒng)、Linux系統(tǒng)、WinNT/Win2k、Windows 95/98、Mac OS等平臺(tái)。Qt的C++類(lèi)庫(kù)同Windows平臺(tái)上的MFC、OWL、VCL是同類(lèi)型的。但Qt還具有下列優(yōu)點(diǎn):

①支持跨平臺(tái)運(yùn)行。

Qt支持下列操作系統(tǒng):Windows NT、Linux、Unix、Mac OS、HP—UX、FreeBSD等。

②豐富的API。

Qt包括多達(dá)250個(gè)以上的C++類(lèi),還提供了基于模板的collections、serialization、file、device、di—rectory management和date/time類(lèi),甚至還包括正則表達(dá)式的處理功能。

③面向?qū)ο蟮某绦蛟O(shè)計(jì)。

Qt具有良好封裝機(jī)制,這使得Qt的模塊化程度非常高,可重用性好,對(duì)于用戶(hù)開(kāi)發(fā)方便、快捷。Qt使用一種信號(hào)/槽一(signals/slots)的機(jī)制,使得各個(gè)對(duì)象之間的協(xié)同工作變得十分簡(jiǎn)單。

④支持2D/3D圖形渲染,支持OpenGL。

⑤大量的開(kāi)發(fā)文檔。

1.2 Qt的信號(hào)槽機(jī)制

嵌入式Linux操作系統(tǒng)沿襲了Unix系統(tǒng)的架構(gòu),具有成熟、可靠、穩(wěn)定等特點(diǎn);Linux是開(kāi)源的操作系統(tǒng),因此任何系統(tǒng)的設(shè)計(jì)者均可以根據(jù)實(shí)際需求對(duì)其進(jìn)行二次開(kāi)發(fā),只保留相關(guān)操作系統(tǒng)功能,同時(shí)可根據(jù)實(shí)際應(yīng)用的需要優(yōu)化操作系統(tǒng)的代碼,體系結(jié)構(gòu)靈活,易于裁剪,免費(fèi)使用等特點(diǎn),使其成為嵌入式系統(tǒng)開(kāi)發(fā)的重要工具[3]。

創(chuàng)建自定義的窗口部件方法有:

對(duì)一個(gè)已經(jīng)存在的Qt窗口部件進(jìn)行子類(lèi)化;

將QWidget類(lèi)與現(xiàn)有窗口部件類(lèi)進(jìn)行組合,重新實(shí)現(xiàn)虛函數(shù);

子類(lèi)化QWidget,并且通過(guò)重新實(shí)現(xiàn)一些用來(lái)繪制窗口部件及響應(yīng)鼠標(biāo)點(diǎn)擊的事件處理器;

由于Qt未提供表盤(pán)控件類(lèi),且無(wú)法通過(guò)Qt提供的控件組合實(shí)現(xiàn),因此只能采用第三種方法即直接對(duì)QWidget進(jìn)行子類(lèi)化,然后通過(guò)QPainter在QWidget窗口部件上進(jìn)行繪制此表盤(pán)控件,同時(shí)添加部件響應(yīng)事件。另外,將自繪制好的表盤(pán)控件集成到Qt設(shè)計(jì)師中,這樣就可以像使用內(nèi)置的Qt窗口部件一樣來(lái)使用了。

通過(guò)此種方法創(chuàng)建的表盤(pán)控件可實(shí)現(xiàn)跨平臺(tái)。

Qt的二維圖形引擎是基于QPainter類(lèi)。QPainter既可以繪制幾何性狀如點(diǎn)、線、矩形、橢圓、弧形、弦形、餅形等,也可以繪制像素映射、圖像和文字。此外,QPainter還支持高級(jí)特性如反走樣、像素混合、漸變填充、矢量路徑等。

QPainter可以在“繪圖設(shè)備”上進(jìn)行畫(huà)圖,如QWidget、QPixmap、QImage等。通過(guò)重新實(shí)現(xiàn)QWidget::paintEvent()函數(shù),即可在窗口部件上隨心所欲的控制所要繪制的部件的外觀、形狀等。

1.3 坐標(biāo)系介紹

Qt中每一個(gè)窗口都有一個(gè)坐標(biāo)系,默認(rèn)窗口左上角為坐標(biāo)原點(diǎn),然后水平向右依次增大,水平向左依次減小,垂直向下依次增大,垂直向上依次減小。原點(diǎn)即為(0,0)點(diǎn),然后以像素為單位增減。

1.3.1 坐標(biāo)系變換

坐標(biāo)系變換是利用變換矩陣來(lái)進(jìn)行的,可以利用QTransform類(lèi)來(lái)設(shè)置變換矩陣,因?yàn)橐话悴恍枰M(jìn)行更改,所以這里就不再涉及。下面只是對(duì)坐標(biāo)系的平移、縮放、旋轉(zhuǎn)、扭曲等函數(shù)進(jìn)行介紹。

利用函數(shù)void QPainter::translate(qreal dx,qreal dy)實(shí)現(xiàn)平移。

利用函數(shù)void QPainter::scale(qreal sx,qreal sy)實(shí)現(xiàn)縮放。

利用函數(shù)void QPainter::rotate(qreal angle)實(shí)現(xiàn)旋轉(zhuǎn)。

1.3.2 坐標(biāo)系統(tǒng)的保護(hù)

平移函數(shù)、旋轉(zhuǎn)函數(shù)已經(jīng)將坐標(biāo)系進(jìn)行了變換,所以需要將變換的坐標(biāo)系再恢復(fù),要用到兩個(gè)函數(shù):

Void QPainter::save() 保存坐標(biāo)系現(xiàn)在的狀態(tài);

Void QPainter::restore() 恢復(fù)以前的坐標(biāo)系。

可以利用save()函數(shù)保存坐標(biāo)系現(xiàn)在的狀態(tài),然后進(jìn)行變換操作,操作完之后,再用restore ()將以前的坐標(biāo)系狀態(tài)進(jìn)行恢復(fù),其實(shí)是一個(gè)入棧和出棧的操作。

2? 表盤(pán)控件類(lèi)的設(shè)計(jì)與實(shí)現(xiàn)

本設(shè)計(jì)將QWidget作為父對(duì)象,定義了用于有關(guān)表盤(pán)屬性的相關(guān)變量如下:

2.1 表盤(pán)頭文件(adwidget.h)介紹

頭文件中需要加載如圖2所示的類(lèi):

在ADWidget類(lèi)中使用Q_PROPERTY()宏聲明了自定義屬性:

arcLineColor,每個(gè)屬性都有一個(gè)數(shù)據(jù)類(lèi)型、一個(gè)“讀”函數(shù)和一個(gè)作為可選項(xiàng)的“寫(xiě)”函數(shù)。

在Qt Designer工具中使用窗口部件時(shí),在屬性編輯器里的QWidget屬性下會(huì)顯示這些自定義的屬性。這些屬性可以是有QVariant所支持的任何類(lèi)型。

ADWidget.h包含其私有函數(shù)和私有變量。這些私有變量保存這“寫(xiě)”屬性的值。顏色數(shù)據(jù)保存在私有變量中,可以通過(guò)setArcLineColor()和arcLineColor()函數(shù)對(duì)它們進(jìn)行訪問(wèn)。

2.2 表盤(pán)控件類(lèi)的構(gòu)造函數(shù)和類(lèi)方法

類(lèi)的方法在ADWidget.h的文件中定義,ADWidget.cpp文件中實(shí)現(xiàn)其所有方法的定義。

2.2.1 構(gòu)造函數(shù)

構(gòu)造函數(shù)中初始化所有私有變量及賦初值。并定義QPainter的對(duì)象,設(shè)置其相關(guān)屬性;定義畫(huà)表盤(pán)的刻度的畫(huà)筆并設(shè)置畫(huà)筆的顏色、粗細(xì)等屬性;同時(shí)定義設(shè)置畫(huà)表盤(pán)指針相關(guān)屬性和坐標(biāo),設(shè)置指針的顏色。

2.2.2 重載paintEvent函數(shù)

當(dāng)表盤(pán)窗口發(fā)生變化或模擬量數(shù)值發(fā)生變化時(shí),自動(dòng)調(diào)用此函數(shù)重新實(shí)現(xiàn)畫(huà)線、等相關(guān)操作。在paintEvent函數(shù)中調(diào)用QPainter的對(duì)象函數(shù)實(shí)現(xiàn)畫(huà)線、畫(huà)弧、畫(huà)數(shù)字等操作。

在設(shè)定的區(qū)域矩形區(qū)域內(nèi)畫(huà)圓弧,圓弧半徑為m_circleRadius(default:140),以(150,150)為中心點(diǎn)畫(huà);

painter.rotate(a);是以給定的角度(正 順時(shí)針/ 負(fù) 逆時(shí)針)旋轉(zhuǎn)坐標(biāo)系;通過(guò)調(diào)用painter.save(),將坐標(biāo)系進(jìn)行保存;調(diào)用painter.restore()恢復(fù)之前的坐標(biāo)系;

計(jì)算-135°位置處的坐標(biāo)起始點(diǎn),根據(jù)角度關(guān)系,算出刻度的坐標(biāo)終點(diǎn);通過(guò)旋轉(zhuǎn)可獲得所有刻度。

表盤(pán)的指針從-180°處計(jì)算,根據(jù)指針定義大小,確定指針起始坐標(biāo)及中間坐標(biāo)點(diǎn),如圖3所示。

3? 表盤(pán)實(shí)現(xiàn)效果

表盤(pán)類(lèi)在main函數(shù)定義對(duì)象,并運(yùn)行后實(shí)現(xiàn)的效果如圖4所示。

4? 結(jié)論

本文設(shè)計(jì)了一種基于Linux Qt開(kāi)發(fā)工具的列車(chē)表盤(pán)控件,此控件能夠滿(mǎn)足數(shù)據(jù)顯示的需要,尤其是車(chē)輛速度的顯示。此控件繼承了Qt框架提供的QWidgt類(lèi),利用 QLinearGradient類(lèi)、QPainter類(lèi)、QLabel等類(lèi),通過(guò)坐標(biāo)變換函數(shù)及旋轉(zhuǎn)函數(shù),實(shí)現(xiàn)指針的旋轉(zhuǎn)操作;通過(guò)重新實(shí)載paintEvent函數(shù),實(shí)現(xiàn)控件的實(shí)時(shí)顯示。同時(shí),可將此控件集成到QDesigner工具中,豐富了原有控件庫(kù)。經(jīng)過(guò)實(shí)際項(xiàng)目驗(yàn)證,該控件類(lèi)設(shè)計(jì)友好、個(gè)性化程度較高,能滿(mǎn)足客戶(hù)需求。

參考文獻(xiàn):

[1]閆鋒欣,曾泉人,張志強(qiáng)譯.Jasmin Blanchette, Mark Summe

dield.C++GUI Qt4編程(第2版)[M].北京:電子工業(yè)出版社,201l:2-4.

[2]彭均鍵,史步海,劉洋.基于Qt的嵌入式GUI開(kāi)發(fā)平臺(tái)的搭建[J].微型電腦應(yīng)用2010,26(02):1-3.

[3]陳孝文,陳蜀宇,馬同杰.基于Linux的嵌入式圖形用戶(hù)界面的研究與應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用[J].2009:1-2.

猜你喜歡
人機(jī)界面
淺談無(wú)錫地鐵信號(hào)系統(tǒng)人機(jī)界面的應(yīng)用與研究
地鐵綜合監(jiān)控人機(jī)界面設(shè)計(jì)分析
人機(jī)界面設(shè)計(jì)中的心理學(xué)因素
新媒體視角下人機(jī)界面設(shè)計(jì)中的交互設(shè)計(jì)方式研究
基于眼動(dòng)實(shí)驗(yàn)的數(shù)控機(jī)床人機(jī)界面改善研究
基于人因工程的核電站人機(jī)界面設(shè)計(jì)
核電廠主控室畫(huà)面設(shè)計(jì)研究
關(guān)于深化火力發(fā)電廠DCS應(yīng)用的幾個(gè)方向
飛機(jī)電源系統(tǒng)故障診斷專(zhuān)家系統(tǒng)研究