Qt界面開發紀實:Qt5 VS2017配置 Qt多線程實時刷新界面(QT C++ MSVC MinGW )(1)

Qt界面開發紀實:Qt5 VS2017配置 Qt多線程實時刷新界面(QT C++ MSVC MinGW )(1)

上一篇博客 https://blog.csdn.net/TiffanyXYf/article/details/99685835 可以算是粗略地記錄了一下開發過程中踩到的坑,但是終究不夠詳細,對於新手來說參考意義不大,故在此詳細介紹在開發過程中走的每一步,方便自己回顧,也方便新手參考。

開發工具,開發語言以及其它條件

根據甲方爸爸的要求,我們需要設計一個能夠被主界面調用的子界面。由於他們的主界面是Qt做的,要求我們的開發環境也需要是Qt的;開發語言爲C++。整個界面需要完成的功能包括:1.使用工業相機採集圖片;2.對採集到的圖片進行處理;3.根據主控命令(也就是主界面)的指令返回圖片處理的結果;4.需要能夠實時刷新或者以0.2s每次刷新界面;5.需要支持調試,調試內容較多,這裏不做過多講述。
所以我們的界面開發需要具備的條件有三個:1.Qt;2.C++; 3.工業相機。

開發工具的配置

在接手這項工作之前,博主沒有接觸過Qt,也沒有用過C++進行過界面開發的工作,加上對VS稍微有一點熟悉,就聽從師姐的建議在VS上集成Qt的開發工具,而在VS上進行開發(VS2017)。但是VS有一點比較麻煩,就是選擇的Qt編譯器必須是MSVC的,而不支持MinGW。博主在這方面吃了虧。(具體情況和工業相機的SDK有關,詳情也可以查看上一篇博客)。總之,使用工業相機的C語言接口可以在VS上開發Qt界面,頭文件和源文件都可以在直接在Qt上使用MingW編譯。
如何配置VS+Qt
首先在VS的拓展和更新處查找Qt:工具==》拓展和更新。直接搜索下載就可以,我這裏是已經安裝好了。下載完成後,VS的菜單欄會多處一個Qt的菜單。
在這裏插入圖片描述
在這裏插入圖片描述
上述工作進行的過程中,安裝Qt。和安裝一般的軟件一樣,只有一點需要注意,就是選擇需要的編譯器。我直接選了MSVC和MinGW,32位和64位共四種。安裝即可。

Qt安裝好之後,爲VS的“Qt VS Tools”設置編譯器:點擊Qt VS Tools ==》 最下方Qt Options ==》選擇你要使用的編譯器(如圖,點擊Add後直接從你的Qt安裝目錄中選定,選到如圖所示的目錄即可,VS記得選擇MSVC的編譯器)選擇完成後就可以可以使用了。
在這裏插入圖片描述
在這裏插入圖片描述

新建工程
新建Qt GUI Application即可。
在這裏插入圖片描述
這個過程中可能會出現的坑:Qt VS Tools這裏只顯示Qt version 3.幾.幾……,沒有所謂的選擇編譯器版本這些選項這個時候需要更新VS。 劃重點,這裏需要更新VS

如何實時刷新界面

信號槽機制+多線程實現界面刷新
信號和槽函數
信號和槽函數是Qt具備特色的機制。Qt通過信號函數向系統中發出特定信號,如果該信號沒有特定的槽,則不會觸發任何系統操作;如果有相應的槽函數與之連接,該特定信號發出後,與之對應的槽函數就會被執行。Qt界面中幾乎所有與界面的交互都可以使用信號與槽完成。
把信號與槽連接起來有兩種方式:1.直接再Qt界面上編輯,2.在自己的代碼中將其連接
這兩種方式各自有自己的適用範圍:一般情況屬於同一個UI的操作,可以直接在Qt界面上進行編輯,方便快捷;而屬於不同的UI的信號與槽就可能需要手動綁定了。
在UI界面上點擊如下菜單,進入信號與槽的編輯界面,在這裏可以隨意對UI中的控件添加信號與槽

在這裏插入圖片描述

點擊想要編輯的控件==》下拉鼠標就會出現信號與槽的編輯界面,左邊是信號,右邊是槽,直接配對即可。
在這裏插入圖片描述
而手動配對:定義信號函數+槽函數+配對
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上述的信號與槽屬於不同的類,所以編輯的時候無法直接在UI上直接指定綁定關係。通過QObject::connect()可實現綁定。
發信號的時候直接 emit +你想的發的信號函數就可以了。(比如 emit sing_video(img),其中img是一個QImage的類型的變量)

多線程在實時刷新界面發揮的作用?
界面的顯示本身是一個事件循環,也就是維持界面本身佔用了一個線程,而我們沒有辦法做別的事情。也就是說如果沒有多線程的話,這個程序會等你把所有的別的代碼執行完,再顯示界面。我的界面剛開始就是這樣,運行一次就只能顯示一張圖片。
多線程的作用就是將採集圖像(+圖像處理)與圖像顯示分離開來。顯示界面與圖片處理互不干擾,而界面更新則依靠信號與槽。 開闢新的線程採集圖片,採集到圖片就發出一個信號,這個信號作用於一個對應的槽函數,這個槽函數實現對界面的更改。

Qt中開闢多線程十分簡易,只要繼承Qt中的Qthread就可以實現一個多線程的類,如圖:
在這裏插入圖片描述
你想在子線程中實現的操作可以直接重寫 void run (),線程啓動時就會執行run函數中的操作。

如何啓動
在UI類中聲明這個線程的對象,在UI類的構造函數中把該對應的信號與槽對應好,然後啓動線程即可。一般子線程中會寫一個while循環來實現這個線程一直執行,並且不停地發信號,退出時打破循環
在UI類中聲明線程對象
UI類的構造函數中啓動線程
結束線程的時候,注意指針操作:
在這裏插入圖片描述

交換相機

前提情況:四個線程併發運行,分別操作不同的相機(採集圖像、圖像處理,顯示處理結果)。在這種情況下我們需要交換圖像顯示的順序。由於每個線程對應的顯示框是一定的,所以這裏值需要交換相機就可以了。爲了簡單起見,相機交換時會調用

thread->quit();
thread->wait();

交換完畢再調用

thread->start();

從而將線程重新啓動。
而啓動的線程的個數是和相機個數一致,棄用的相機對應的線程也會重新啓動,但是由於棄用相機的flag是無效,所以線程會直接退出。

下一篇會接着介紹:在這個界面開發中學會的操作與遇到的坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章