摘 要: 根據(jù)醫(yī)院病房工作特點(diǎn),實(shí)現(xiàn)了基于Qt/Embedded的病房管理系統(tǒng)界面的設(shè)計(jì),。實(shí)驗(yàn)結(jié)果表明,,該病房管理系統(tǒng)界面能較好地實(shí)現(xiàn)病患相關(guān)信息的查詢(xún)顯示以及醫(yī)患交互功能,具有簡(jiǎn)潔,、友好的特點(diǎn),。在管理系統(tǒng)上實(shí)現(xiàn)病人信息、治療信息,、病情信息,、醫(yī)囑、費(fèi)用,、呼叫等功能,,并可對(duì)其進(jìn)行移植。詳細(xì)介紹了系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),。
關(guān)鍵詞: 信息技術(shù),;數(shù)字化醫(yī)院;Qt/Embedded,;病房管理系統(tǒng)
將先進(jìn)的計(jì)算機(jī)技術(shù)、通信技術(shù),、傳感器技術(shù)等運(yùn)用在醫(yī)院中,,能有效地減輕醫(yī)護(hù)人員工作強(qiáng)度、提高醫(yī)護(hù)效率和醫(yī)療質(zhì)量,、可盡量減少誤差以避免醫(yī)療事故和醫(yī)療差錯(cuò),,為公眾提供優(yōu)質(zhì)便捷的醫(yī)療服務(wù),使醫(yī)院更加高效,、可靠地運(yùn)營(yíng),。病房管理系統(tǒng)是數(shù)字化醫(yī)院的重要組成部分,良好的界面設(shè)計(jì)則是系統(tǒng)可用和易用的關(guān)鍵,。本文利用嵌入式技術(shù)和Qt界面開(kāi)發(fā)技術(shù),,完成了一種簡(jiǎn)潔實(shí)用的病房管理系統(tǒng)界面設(shè)計(jì),成功實(shí)現(xiàn)了前臺(tái)界面和后臺(tái)數(shù)據(jù)庫(kù)的連接,,為病患查詢(xún)相關(guān)信息,、與醫(yī)護(hù)人員交互提供了友好的平臺(tái)。
1 系統(tǒng)界面功能需求及開(kāi)發(fā)平臺(tái)
1.1 系統(tǒng)界面功能需求
根據(jù)項(xiàng)目需求分析,,所設(shè)計(jì)的病房管理系統(tǒng)圖形界面如圖1所示,,其主要功能[1]包括病人信息,、治療信息、病情信息,、短消息,、醫(yī)囑、費(fèi)用,、呼叫,、調(diào)試頁(yè)等。
1.2 系統(tǒng)界面開(kāi)發(fā)平臺(tái)
本系統(tǒng)在以S3C6410A微處理器芯片為核心的嵌入式終端系統(tǒng)硬件平臺(tái)上,,利用Qt作為圖形界面開(kāi)發(fā)工具,。Qt是一個(gè)跨平臺(tái)的C++開(kāi)發(fā)工具,不但擁有完善的C++圖形庫(kù),,還集成了數(shù)據(jù)庫(kù),、OpenGL庫(kù)、多媒體庫(kù),、網(wǎng)絡(luò)庫(kù),、腳本庫(kù)、XML庫(kù),、WebKit庫(kù)等,,而其內(nèi)核庫(kù)還加入了進(jìn)程間通信、多線程等模塊,,極大地豐富了Qt開(kāi)發(fā)大規(guī)模復(fù)雜跨平臺(tái)應(yīng)用程序的能力,。
Qt/Embedded是圖形化界面開(kāi)發(fā)工具Qt的嵌入式版本,它通過(guò)QtAPI與Linux I/O以及Framebuffer[2]直接交互,,擁有較高的運(yùn)行效率,,而且整體采用面向?qū)ο缶幊蹋瑩碛辛己玫捏w系架構(gòu)和編程模式,。
2 系統(tǒng)界面的開(kāi)發(fā)過(guò)程
在GUI用戶(hù)界面中,,當(dāng)用戶(hù)操作一個(gè)窗口部件時(shí), 需要其他窗口部件的響應(yīng)或者能夠激活其他的操作,。而在程序開(kāi)發(fā)中,,經(jīng)常使用回調(diào)機(jī)制來(lái)實(shí)現(xiàn)。但Qt提供的信號(hào)和槽機(jī)制不同于回調(diào)函數(shù)機(jī)制,,其信號(hào)是一個(gè)特定的標(biāo)識(shí),;而槽機(jī)制是一個(gè)槽就是一個(gè)函數(shù),與一般的函數(shù)不同,,槽函數(shù)既能夠與信號(hào)關(guān)聯(lián),,也能夠像普通函數(shù)一樣直接調(diào)用。當(dāng)某個(gè)事件出現(xiàn)時(shí),,通過(guò)發(fā)送信號(hào),,可以將與之相關(guān)聯(lián)的槽函數(shù)激活,,即執(zhí)行槽函數(shù)代碼。在程序中,,使用QObject::connect()函數(shù)來(lái)將某個(gè)信號(hào)和某個(gè)槽進(jìn)行關(guān)聯(lián),,而信號(hào)和槽之間的真正關(guān)聯(lián)是由Qt的信號(hào)和槽機(jī)制來(lái)實(shí)現(xiàn)的。
系統(tǒng)界面的開(kāi)發(fā)主要分4個(gè)部分:(1)軟件平臺(tái)的移植,;(2)系統(tǒng)圖形界面的設(shè)計(jì),;(3)系統(tǒng)界面功能的實(shí)現(xiàn),主要通過(guò)TCP訪問(wèn)服務(wù)器并接收其發(fā)出的數(shù)據(jù),;(4)系統(tǒng)界面的移植,。
2.1 Qt/Embedded的移植
實(shí)現(xiàn)Qt/Embedded的移植[3]需要下載qt-everywhere-opensource-src-4.7.3軟件包。由于完整的Qt/Embedded圖形庫(kù)對(duì)于嵌入式設(shè)備資源的要求很高,,因此,,應(yīng)根據(jù)項(xiàng)目需求在安裝過(guò)程中利用參數(shù)進(jìn)行配置和剪裁。主要參數(shù)配置如下:
-prefix //設(shè)置安裝路徑
-qt-mouse-tslib //支持觸摸屏
-I /usr/local/arm/tslib/build/include
//指定觸摸屏的頭文件目錄
-L /usr/local/arm/tslib/build/lib
//指定觸摸屏的庫(kù)文件目錄
利用make進(jìn)行編譯,,然后利用make install把安裝文件打包下載到ARM板上,,這樣即完成了Qt/Embedded的移植。
2.2 系統(tǒng)圖形界面的設(shè)計(jì)
2.2.1 網(wǎng)頁(yè)界面的設(shè)計(jì)
根據(jù)項(xiàng)目需求,,利用Qt creator設(shè)計(jì)整體的操作界面,。首先創(chuàng)建一個(gè)主窗口,在這個(gè)窗口上放置一個(gè)QTabWidget窗口部件,,并在其頂部可以編輯系統(tǒng)的一些功能,,如:ui->tabWidget->setTabText(0,tr("病人信息")),,定義該窗口標(biāo)簽為病人信息,;然后在這一窗口部件上放置一個(gè)QWebView子窗口部件。QWebView類(lèi)是Qt webkit模塊中最常用到的類(lèi)之一,,它用來(lái)創(chuàng)建一個(gè)可以view和edit文檔的widget,也就是說(shuō)可以通過(guò)QWebView來(lái)查看和編輯網(wǎng)頁(yè),,即通過(guò)QWebView類(lèi)可以實(shí)現(xiàn)病人信息的查看,。其系統(tǒng)的網(wǎng)頁(yè)界面(ui)的設(shè)計(jì)如圖2所示。
2.2.2 呼叫界面的設(shè)計(jì)
首先建立一個(gè)主窗口,,在這個(gè)主窗口上放置一個(gè)行編輯框用來(lái)輸入病床號(hào),、若干個(gè)數(shù)字按鈕、一個(gè)呼叫按鈕和一個(gè)掛斷按鈕,。輸入要呼叫的病床號(hào),,當(dāng)按下呼叫按鈕時(shí),發(fā)出信號(hào)signal(),,將與之相關(guān)聯(lián)的槽函數(shù)slot()激活,,執(zhí)行槽函數(shù)代碼,。實(shí)現(xiàn)代碼為connect(ui->StartCall,SIGNAL(clicked()),,this,,SLOT(startCall()))。其系統(tǒng)的呼叫界面的設(shè)計(jì)如圖3所示,。
Qt提供了QTcpSocket類(lèi)[5]和QTcpServer類(lèi),,用于編寫(xiě)TCP客戶(hù)端和服務(wù)器的應(yīng)用程序。QTcpSocket類(lèi)提供了TCP協(xié)議的通用接口,,采用異步工作方式,,依靠Qt事件循環(huán)發(fā)現(xiàn)外來(lái)數(shù)據(jù)和向外發(fā)送的數(shù)據(jù),并以信號(hào)的方式報(bào)告狀態(tài)改變或產(chǎn)生的錯(cuò)誤,。而QTcpServer類(lèi)則在服務(wù)器端處理外來(lái)的TCP客戶(hù)連接,,其功能實(shí)現(xiàn)的主要代碼如下:
host=settings.value("PC_SERVER_IP","192.168.1.2").toString(),; //ARM端的TCPServer監(jiān)聽(tīng)該端口
m_configTcpport=settings.value("LISTEN_PC_TCP_PORT",,
6666).toInt();
//當(dāng)需要更新數(shù)據(jù)時(shí),,ARM向PC該端口發(fā)送"arm\r\n"
tcpSocket=new QTcpSocket(this),; //變量tcpSocket
//是QTcpSocket的實(shí)例,封裝了一條TCP連接
void MainWindow::manualUpdateConnectSuccess()
//定義一個(gè)更新數(shù)據(jù)的函數(shù)
void MainWindow::manualUpdateReceiveData()
//定義一個(gè)接收更新后的數(shù)據(jù)的函數(shù)
connect(tcpSocket,,SIGNAL(connected()),,this,SLOT
(manualUpdateConnectSuccess())),;
connect(tcpSocket,,SIGNAL(readyRead()),this,,SLOT
(manualUpdateReceiveData())),;
一旦連接建立成功,QTcpSocket類(lèi)將發(fā)出connected()消息,,繼而調(diào)用manualUpdateConnectSuccess()槽函數(shù),。manualUpdateConnectSuccess()函數(shù)則進(jìn)行數(shù)據(jù)更新,當(dāng)發(fā)出數(shù)據(jù)時(shí),,QTcpSocket類(lèi)將會(huì)產(chǎn)生readyRead()信號(hào),,繼而調(diào)用manualUpdateReceiveData()槽函數(shù),接收更新后的新數(shù)據(jù),。如果連接或數(shù)據(jù)傳輸過(guò)程中的某次操作發(fā)生錯(cuò)誤,,QTcpSocket類(lèi)會(huì)發(fā)出error()信號(hào),并觸發(fā)錯(cuò)誤處理函數(shù)displayError(),關(guān)閉連接,。其功能實(shí)現(xiàn)代碼如下:
tcpServer=new QTcpServer(this),;
//變量tcpServer是QTcpServer類(lèi)的實(shí)例,
//它負(fù)責(zé)監(jiān)聽(tīng)并處理外來(lái)連接請(qǐng)求
clientConnection=new QTcpSocket(this),;
//clientConnection是QTcpSocket類(lèi)的實(shí)例,,
//它封裝了一條TCP連接
tcpServer->listen(QHostAddress::Any,m_configTcpport),;
//QTcpServer的listen()函數(shù)判斷當(dāng)前服務(wù)器已處
//在監(jiān)控狀態(tài)以及在本地端口建立監(jiān)聽(tīng)已成功
connect(tcpServer,,SIGNAL(newConnection()),this,,
SLOT(acceptConnection())),;
void MainWindow::acceptConnection()
//具體實(shí)現(xiàn)接收客戶(hù)端連接請(qǐng)求并做回應(yīng)的函數(shù)
{
clientConnection=tcpServer->nextPendingConnection();
connect(clientConnection,,SIGNAL(readyRead()),,this,
SLOT(tcpServerReceiveData())),;
}
當(dāng)有客戶(hù)端連接請(qǐng)求到來(lái)時(shí),,QTcpSocket類(lèi)將會(huì)發(fā)出newConnection()信號(hào),從而觸發(fā)acceptConnection()函數(shù),。QTcpServer類(lèi)在接收了外來(lái)TCP連接請(qǐng)求后,,可以通過(guò)nextPendingConnection()函數(shù)獲取一個(gè)新的已建立連接的子套接字,并返回QTcpSocket類(lèi)指針將返回值保存在clientConnection變量中,;當(dāng)建立的連接有新的可供讀取的數(shù)據(jù)時(shí),,QTcpSocket類(lèi)會(huì)發(fā)出readyRead()信號(hào),從而觸發(fā)tcpServerReceiveData()函數(shù),,該函數(shù)完成數(shù)據(jù)的接收,;而當(dāng)新連接中產(chǎn)生錯(cuò)誤時(shí)則會(huì)發(fā)出error()信號(hào)。
2.4 圖形界面的移植
完成Qt應(yīng)用程序在PC端的Linux下的仿真運(yùn)行,、對(duì)源程序進(jìn)行交叉編譯,、將生成的可執(zhí)行文件和相關(guān)的庫(kù)文件拷貝到開(kāi)發(fā)板上,即可實(shí)現(xiàn)移植,,在開(kāi)發(fā)板上將顯示出如圖5所示的圖形界面,。
在Linux操作系統(tǒng)下,采用Qt/Embedded作為圖形界面開(kāi)發(fā)工具,,利用其高效性和跨平臺(tái)性,實(shí)現(xiàn)了病房管理系統(tǒng)界面的設(shè)計(jì),,并進(jìn)行移植,,使其穩(wěn)定地在ARM11開(kāi)發(fā)板上運(yùn)行。保證了應(yīng)用系統(tǒng)的快速高效,極大地提高了護(hù)士,、醫(yī)生的工作效率,,同時(shí)給醫(yī)院和病人帶來(lái)很大的方便。
參考文獻(xiàn)
[1] 馬錫坤,,徐旭東,,胡敏.病房醫(yī)生工作站信息系統(tǒng)的功能與應(yīng)用[J].醫(yī)療設(shè)備信息,2007(1).
[2] 丁林松,,黃麗琴.Qt4圖形設(shè)計(jì)與嵌入式開(kāi)發(fā)[M].北京:人民郵電出版社,,2009.
[3] 趙辛晨,吳仲光,,唐建兵.基于Qt/Embedded的數(shù)碼一體機(jī)圖形界面設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,,2011,30(7).
[4] SCAGLIA S.嵌入式Internet TCP/IP基礎(chǔ),、實(shí)現(xiàn)及應(yīng)用[M].潘琢金,,徐蕾,拱長(zhǎng)青,,譯.北京:北京航空航天大學(xué)出版社,,2008.
[5] 蔡志明,盧傳富,,李立夏.精通Qt4編程[M].北京:電子工業(yè)出版社,,2008.