一,前言
之前我把小目標(biāo)進(jìn)行了調(diào)整,提及了制作上位機(jī)工具,那么就需要做一個(gè)像樣的上位機(jī)工具,就像我們平時(shí)PC上安裝的APP一樣。而暫時(shí)我選擇用QT。那么我先看了下別人在github上基于QT開發(fā)的c++ PC代碼工程,給我提供了開發(fā)思路及創(chuàng)作靈感。做大型工程前,我需要通過(guò)刻意練習(xí)來(lái)熟悉API。
二,小練習(xí)目標(biāo)
既然是PC桌面程序,那么最基本的就是窗體,本次練習(xí)的目標(biāo)如下
1.經(jīng)典老式的窗口(非window ribbon格式)。包括菜單欄,工具欄,和狀態(tài)欄。
2.不生成ui,窗口自動(dòng)布局。包括設(shè)置基本的輸入輸出控件。
3.縮小后的托盤及右鍵功能。
定義了目標(biāo),等于定義了軟件主要功能需求,那么我可以開始動(dòng)手了。
三,問(wèn)題記錄
1. 沒有UI界面我如何創(chuàng)建菜單欄?
解決方法:創(chuàng)建QMenu和QAction,并添加到QMenuBar對(duì)象。
QMenuBar: 就是所有窗口的菜單欄,在此基礎(chǔ)上添加不同的QMenu和QAction。
QMenu: 菜單欄里面菜單,可以顯示文本和圖標(biāo),但是并不負(fù)責(zé)執(zhí)行操作,有點(diǎn)類似label的作用。
QAction: Qt 將用戶與界面進(jìn)行交互的元素抽象為一種“動(dòng)作”,使用QAction類表示。QAction才是真正負(fù)責(zé)執(zhí)行操作的部件。
2. Menubar通過(guò)layout設(shè)置后底色及寬度都不對(duì)?
解決方法:參考官網(wǎng)example,路徑為QT安裝路徑,D:\Qt\Examples\Qt-6.0.2\widgets\mainwindows\application。原因是我創(chuàng)建的是widget類而不是mainwindows類。然后創(chuàng)建的menubar綁定到mainwindows類中的menubar即可。QMenuBar* pMenuBar = menuBar();//new QMenuBar();所以對(duì)于menubar不需要設(shè)置layout置頂。
3. QIcon的png如何如何綁定?
解決方法:一定要添加到資源文件路徑。否則setWindowIcon(QIcon(":./images/title.png"));無(wú)法訪問(wèn)到圖片。
4. 如何使用新的方式自定義信號(hào)和槽?
解決方法:用對(duì)象和類的方法作為形參即可。比如connect(pActionA1, &QAction::triggered, this, &MainWindow::open);
5. 如何添加狀態(tài)欄?
解決方法:參考官網(wǎng)example,原來(lái)狀態(tài)欄就是mainwindows中的成員statusBar()。直接用即可statusBar()->showMessage(tr("File saved"), 2000);初始化UI的時(shí)候設(shè)置statusBar()->showMessage(tr("Ready"));,狀態(tài)欄就會(huì)一直顯示。
6. 如何綁定toolbar使其顯示出來(lái)?
解決方法:和Menubar的顯示類似,參考官網(wǎng)example。QToolBar *fileToolBar = addToolBar(tr("File"));即可鏈接到mainwindow進(jìn)行顯示。一般toolbar和menubar一起設(shè)置的,因?yàn)殛P(guān)聯(lián)的action是一樣的。在工具欄中有圖標(biāo)的則顯示圖標(biāo),沒有圖標(biāo)的則顯示文字。
7. mainwindow如何通過(guò)代碼添加控件?
解決方法:通過(guò)setCentralWidget來(lái)設(shè)置widget,但是有多個(gè)Widget就需要使用QHBoxLayout和QVBoxLayout完成布局,但是setCentralWidget的參數(shù)必須是Qwidget,所以創(chuàng)建一個(gè)Qwidget并添加最后的layout。
QWidget *centerWindow = new QWidget;
this->setCentralWidget(centerWindow);
centerWindow->setLayout(mainLayout);
8. QmessgeBox如何換行?
解決方法:添加關(guān)鍵字<br>,比如QMessageBox::information(NULL,"關(guān)于",QString("作者:AppleCai<br>版本:V1.00"), QMessageBox::Ok);
9. QT如何捕獲窗口關(guān)閉按鈕的事件?
解決方法:重寫void closeEvent(QCloseEvent *event);函數(shù),里面可以用QMessageBox的響應(yīng)結(jié)果作為判斷邏輯。
10.QT如何添加托盤功能?
解決方法:參考官網(wǎng)exampleD:\Qt\Examples\Qt-6.0.2\widgets\desktop\systray。設(shè)置托盤menu并且綁定action。關(guān)于顯示最小化托盤的思路是捕獲到點(diǎn)擊關(guān)閉的時(shí)候提示是否退出或縮小??s小就是到啟動(dòng)托盤,并且隱藏窗體。
四,截圖
做了一個(gè)文本編輯器。



五,小結(jié)
模仿是一種比較快速的學(xué)習(xí)方法,通過(guò)學(xué)習(xí)example來(lái)逐步了解QT6界面編程API還是比較高效的一種方法,另外QT的help很好,不但有方法提示,而且F1直接看具體內(nèi)容。