【正文】
意無論有沒有東西接收它所發(fā)射的信號。信號/槽機(jī)制完全不依賴于任何一種圖形用戶界面的事件回路。信號與插槽機(jī)制并不要求類之間互相知道細(xì)節(jié),這樣就可以相對容易的開發(fā)出代碼可高重用的類(Matthias Dalheimer,2022)。 (實(shí)際上一個槽的簽名可以比它接收的信號的簽名少,因?yàn)樗梢院雎灶~外的簽名。它以警告的方式報告類型錯誤,而不會使系統(tǒng)產(chǎn)生崩潰。Qt 的信號和槽的機(jī)制可以保證如果你把一個信號和一個槽連接起來,槽會在正確的時間使用信號的參數(shù)而被調(diào)用。它們是完全類型安全的:不會再有回調(diào)核心轉(zhuǎn)儲(core dump)。把一個信號和另一個信號直接相連也是可以的。 )總體來看,信號和槽構(gòu)成了一個強(qiáng)有力的組件編程機(jī)制。 signals、slots 和 emit 是 Qt 特有的關(guān)鍵字,分別用來表示信號、槽、和發(fā)送信號,移除這些關(guān)鍵字和預(yù)處理程序,就可以使用標(biāo)準(zhǔn)的 C++編譯器。一個 protected slots:包含了只有這個類和它的子類的信號才能連接的槽。 一個 private slots:包含了只有這個類本身的信號可以連接的槽,甚至它的子類都沒有獲得連接的權(quán)利。它基于下列三類:QObject 類、類聲明中的私有段中的Q_OBJECT 宏、元對象編譯器(moc) 。如果它發(fā)現(xiàn)其中包含一個或多個類的聲明中含有Q_OBJECT 宏,它就會給含有 Q_OBJECT 宏的類生成另一個含有元對象代碼的C++源文件。 除了提供對象間通訊的信號和槽機(jī)制之外(介紹這個系統(tǒng)的主要原因) ,QObject 中的元對象代碼實(shí)現(xiàn)其它特征: (1) className()函數(shù)在運(yùn)行的時候以字符串返回類的名稱,不需要 C++編譯器中的本地運(yùn)行類型信息(RTTI)的支持。 (3) tr()和 trUtf8() 兩個函數(shù)是用于國際化中的字符串翻譯。 (5) metaObject()函數(shù)返回這個類所關(guān)聯(lián)的元對象。根據(jù)元對象系統(tǒng)的觀點(diǎn),一個沒有元代碼的 QObject 的子類和它含有元對象代碼的最近的祖先相同。故強(qiáng)烈建議 QObject 的所有子類使用 Q_OBJECT 宏,而不管它們是否實(shí)際使用了信號、槽和屬性(Jonathan Corbet, 2022)。故記事本和電子相冊界面大小設(shè)定 320*240,并且記事本和電子相冊均支持鍵盤控制操作和點(diǎn)擊(PC 機(jī)上鼠標(biāo)點(diǎn)擊,嵌入式設(shè)備的觸摸屏點(diǎn)擊)控制操作。 記事本架構(gòu)設(shè)計 記事本設(shè)計需求記事本可以將目錄下的記事本文件以文件名列表的形式顯示出來,并可以實(shí)現(xiàn)記事本文件的新建、打開、編輯和刪除等功能;記事本可以根據(jù)文件內(nèi)容的多少來實(shí)現(xiàn)文本的滾動顯示,并可以通過軟鍵盤對文本進(jìn)行編輯等。當(dāng)文件數(shù)目多于當(dāng)前界面顯示范圍,則出現(xiàn)上下方向的滾動條,可以向上或向下滾動顯示文件名。(3) 新建文件功能:新建記事本文件時,提示輸入文件名,如果沒有輸入文件名而選擇直接進(jìn)入文件編輯界面,系統(tǒng)則提供默認(rèn)的文件名用于存儲文件。(4) 控制文本編輯格式功能:編輯文件時,文本內(nèi)容輸入到當(dāng)前界面的右端邊界處自動換行,也可以利用鍵盤操作執(zhí)行換行動作。保存文件后,文件名立即顯示在文件列表上。(6) 文件內(nèi)容編輯和顯示功能:在文件編輯界面上可以對文件的內(nèi)容進(jìn)行編輯和修改。(7) 打開下一個文件功能:在當(dāng)前打開文件列表界面,若選擇“打開一個文件”功能,則顯示下一個文件的內(nèi)容在文件編輯區(qū)。(9) 刪除文件功能:可以在文件列表上對指定文件進(jìn)行刪除操作,也可以打開文件后,對打開的文件進(jìn)行刪除操作。文件被刪除后,文件列表上該文件名被移除。軟鍵盤上的按鍵與物理鍵盤的按鍵位置相對應(yīng)。 記事本界面設(shè)計記事本主要界面設(shè)計: (1) 文件列表界面:如圖 2 所示,界面大小為 320*240。界面的最下方為兩個按鈕,左側(cè)的是功能按鈕,右側(cè)的是返回按鈕,此界面上分別標(biāo)記為“Option”和“Exit”。圖 2 文件列表界面Fig. 2 File list interface(2) 新建文件編輯界面:如圖 3 所示,界面大小為 320*240。中間的顯示區(qū)域?yàn)槲募庉媴^(qū),用于接收文本的輸入。 圖 3 新建文件編輯界面Fig. 3 New document editing interface(3) 打開文件內(nèi)容顯示界面:如圖 4 所示,界面大小為 320*240。界面的最下方左側(cè)為功能按鈕,右側(cè)的是返回按鈕,此界面上分別標(biāo)記為“Option”和“Back” 。菜單上顯示可操作的功能選項(xiàng),并對選定的功能選項(xiàng)高亮顯示。圖 5 功能菜單Fig. 5 Function menu記事本消息提示框設(shè)計: 如圖 6 所示,消息提示框界面大小為 320*界面的最下方左側(cè)為功能按鈕,右側(cè)的是返回按鈕,此界面中分別標(biāo)記為“Yes”和“No” 。記事本軟鍵盤界面設(shè)計:如圖 7 所示,軟鍵盤需要對文本編輯區(qū)進(jìn)行輸入操作,所以軟鍵盤界面盡量要小一些,以免影響了文本編輯區(qū)的使用,但同時也需要保證軟鍵盤上字符的清晰顯示,故軟鍵盤界面大小為設(shè)定為 320*130。 圖 7 軟鍵盤界面Fig . 7 Soft keyboard interface 記事本結(jié)構(gòu)設(shè)計文件列表建立新文件功能選擇功能選擇刪除文件打開文件讀取文件內(nèi)容軟鍵盤輸入文本功能選擇選擇保存修改后文件打開列表中文件讀取內(nèi)容讀取并顯示下一個文件內(nèi)容圖 8 記事本結(jié)構(gòu)圖Fig. 8 Notepad structural diagram如圖 8 所示,文件列表界面是記事本的入口和出口。在文件列表功能菜單中根據(jù)所選擇的菜單條目進(jìn)入相應(yīng)的功能界面,如新建文件編輯界面、文件顯示內(nèi)容界面或刪除文件提示框界面等。 電子相冊架構(gòu)設(shè)計 電子相冊設(shè)計需求電子相冊支持 jpg、png、gif、xpm、和 bmp 格式圖片的瀏覽,并可以對圖片進(jìn)行放大、縮小或旋轉(zhuǎn)角度顯示。(1) 顯示圖片列表功能:在圖片文件所在目錄讀取所有擴(kuò)展名為jpg、xpm、png、bmp、gif 格式的圖片文件,并將讀取的文件按順序用相同大小的縮略圖的形式顯示在圖片列表界面上。其它格式文件忽略不讀。(3) 刪除圖片功能:對當(dāng)前選中的圖片可執(zhí)行刪除操作,選擇刪除后會進(jìn)行刪除確認(rèn)提示,若選擇徹底刪除圖片則從物理設(shè)備上和圖片列表上將該圖片刪除。若圖片原本大小沒有超過圖片瀏覽區(qū)域大小,則以原始尺寸在圖片瀏覽區(qū)域顯示。(5) 圖片放大功能:在當(dāng)前圖片尺寸大小的基礎(chǔ)上,圖片可逐級放大,以尺寸的 倍遞增,最大可放大到打開圖片時顯示的初始尺寸的 3 倍。最小可縮小到打開圖片時顯示的初始尺寸的 倍??稍诋?dāng)前狀態(tài)下,將圖片向左或向右旋轉(zhuǎn),每次旋轉(zhuǎn)角度差值為 90176。(8) 圖片移動功能:圖片執(zhí)行放大功能后,圖片可在瀏覽區(qū)域進(jìn)行移動。為了支持點(diǎn)擊操作,全屏顯示時不覆蓋相關(guān)功能按鈕。(11) 給用戶提供友好的圖形交互界面,并合理安排界面元素布局,使其美觀并且方便用戶操作。界面的上方顯示當(dāng)前選中的圖片的名字。界面的最下方為兩個按鈕,左側(cè)的是功能按鈕,右側(cè)的是返回按鈕,此界面上分別標(biāo)記為“Option”和“Exit”。菜單上顯示可操作的功能選項(xiàng),并對選定的功能選項(xiàng)高亮顯示。圖 10 功能菜單Fig. 10 Function menu相鄰兩個界面之間切換時,若后出現(xiàn)的界面大小小于先出現(xiàn)的界面大小,則第一個界面顯示蒙版即表示為禁用狀態(tài),如圖 10。界面的最下方為兩個按鈕,左側(cè)的是功能按鈕,右側(cè)的是返回按鈕,此界面上分別標(biāo)記為“Option”和“Back” 。通過圖片列表功能菜單,可執(zhí)行打開圖片進(jìn)行瀏覽的功能和刪除圖片的功能,并根據(jù)所選擇的功能進(jìn)入圖片瀏覽界面或顯示刪除文件提示框。放大圖片的顯示,縮小圖片的顯示,旋轉(zhuǎn)圖片的顯示,圖片全屏的顯示和自動瀏覽圖片的顯示均將顯示在圖片瀏覽界面。圖片列表刪除圖片功能選擇縮小顯示圖片打開圖片全屏顯示圖片 自動瀏覽圖片功能選擇放大顯示圖片圖片逆時針旋轉(zhuǎn)圖片順時針旋轉(zhuǎn)正常顯示圖片圖 15 電子相冊結(jié)構(gòu)圖Fig. 15 Album structural diagram4 算法設(shè)計和實(shí)現(xiàn) 記事本主要算法設(shè)計和實(shí)現(xiàn) 記事本類結(jié)構(gòu)設(shè)計N p M y t e x t e d i tN p M e s s a g e b o x N p N o t e p a d F o r m N p S a v e F o r mN p O p e n n o t e F o r m N p F u n c t i o n v i e w F o r m N p N e w n o t e F o r mN p O p e n o p t i o n F o r m N p N e w o p t i o n F o r mN p D e l e t e N o t e F o r mM y K e y b o a r dM y K e y圖 16 記事本類圖Fig. 16 Notepad class diagram類圖說明:NpNotepadForm 為記事本程序的主界面類,即顯示文件列表的類。NpNewnoteForm 為新建文件的功能實(shí)現(xiàn)類。NpDeletenoteForm 為刪除文件的功能實(shí)現(xiàn)類。NpOpenoptionForm 為打開文件功能菜單的實(shí)現(xiàn)類。NpMessagebox 為內(nèi)容修改提示框的功能實(shí)現(xiàn)類。MyTextedit 是 Qt 類中 QTextEdit 類的子類,實(shí)現(xiàn)鍵盤響應(yīng)函數(shù)功能的權(quán)限升級,即從 protected 升級為 public。NpFunctionviewForm 分別與 NpNewnoteForm、NpOpennoteForm、NpDeletenoteForm 成單向關(guān)聯(lián)。NpOpennoteForm 與 NpOpenoptionForm 雙向關(guān)聯(lián)。NpNewnoteForm 分別與 NpOpennoteForm 和 MyKeyboard 單向關(guān)聯(lián)。MyKeyboard 依賴于 MyKey,若 MyKey 類發(fā)生改變 MyKeyboard 也將發(fā)生改變。NpSaveForm 與 NpNewnoteForm 為聚合(聚集)關(guān)系。 記事本功能實(shí)現(xiàn)記事本界面用到的控件主要有 QLable、QToolButton、QTextEdit 和QListBox 等。流程圖如圖 17。流程圖如圖 18。如果文件名不符合要求,則設(shè)置文件名的輸入無效,并提示重新輸入。并且使文本保存時輸入到物理設(shè)備上時支持 unicode 編碼。開始將所有記事本文件名存入鏈表結(jié)束檢查目錄下是否有記事本文件Y e sN o按照文件名鏈表中文件的順序顯示文件名列表在列表顯示界面上設(shè)定文件列表中默認(rèn)選擇項(xiàng)建立文件列表迭代器掃描文件目錄下所有文件包括隱藏文件對目錄下文件按建立時間進(jìn)行排序圖 17 顯示文件列表流程圖Fig. 17 File list showing flow diagram開始結(jié)束S w i t c h ( 選擇菜單項(xiàng) )關(guān)閉父窗口蒙版顯示菜單項(xiàng)關(guān)閉父窗口蒙版新建打開關(guān)閉父窗口蒙版刪除關(guān)閉父窗口蒙版軟鍵盤關(guān)閉父窗口蒙版退出新建文件功能實(shí)現(xiàn) 打開文件功能實(shí)現(xiàn) 刪除文件功能實(shí)現(xiàn) 軟鍵盤功能實(shí)現(xiàn) 返回文件列表圖 18 功能菜單流程圖Fig. 18 Function menu flow diagram 開始進(jìn)入文本編輯界面結(jié)束文件名是否合法Y e sN o設(shè)定文本自動換行位置設(shè)定文本自動換行方式提示輸入文件名提示文件名不合法文本內(nèi)容是否為空 ?N o執(zhí)行菜單功能選擇保存文件還是顯示功能菜單 ?Y e s顯示菜單保存文件接受文本編輯保存文件到當(dāng)前目錄下圖 19 新建文件流程圖Fig. 19 New file flow diagram(4) 打開文件功能的實(shí)現(xiàn):從文件列表選定打開的文件,然后將文件內(nèi)容讀到 QTextStream 中再顯示在 QTextEdit 中,并且規(guī)定顯示格式。如果通過菜單選擇打開下一個文件,則查找到當(dāng)前文件的下一個文件,并將其文件內(nèi)容顯示于界面顯示區(qū)域上。(5) 軟鍵盤的實(shí)現(xiàn): 定義按鍵類 MyKey 繼承自 QPushButton,點(diǎn)擊的時候發(fā)射該按鍵的文字。根據(jù)軟鍵盤上邊緣上的點(diǎn)擊的拖動,通過跟蹤移動點(diǎn)的坐標(biāo)位置,使整個軟鍵盤進(jìn)行相應(yīng)距離的移動。開始結(jié)束設(shè)定文本自動換行位置設(shè)定文本自動換行方式選定待打開的文件N o執(zhí)行菜單功能選擇退出文件還是顯示功能菜單 ?顯示菜單退出文件接受文本編輯退出文件打開文件并顯示文件內(nèi)容文件內(nèi)容是否被修改 ?是否保存修改后的文件內(nèi)容 ?Y e s保存文