【课题报告】OpenCV 抠图项目实战(10)PyQt5 使用
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(10)PyQt5 使用
本系列是 Python 小白的課題作業(yè)《基于OpenCV 的圖像分割和摳圖》。
需要說明的是,本系列并不能算是 OpenCV 的摳圖項(xiàng)目教程,只是以此為主題的課題報(bào)告。其中包括了一個(gè)較為完整的 PyQt 項(xiàng)目。
歡迎關(guān)注『Python 小白的項(xiàng)目實(shí)戰(zhàn) @ youcans』 原創(chuàng)作品
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(1)目錄摘要
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(2)摳圖緒論
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(3)摳圖綜述
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(4)固定閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(5)自適應(yīng)閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(6)色彩范圍摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(7)邊緣檢測
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(8)圖像輪廓
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(9)評(píng)價(jià)指標(biāo)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(10)PyQt5 使用
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(11)算法實(shí)驗(yàn)平臺(tái)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(12)源程序代碼
第六章 基于 PyQt5 的摳圖算法實(shí)驗(yàn)平臺(tái)
6.1 PyQt5 圖形界面開發(fā)工具
Qt 庫是跨平臺(tái)的 C++ 庫的集合,是最強(qiáng)大的 GUI 庫之一,可以實(shí)現(xiàn)高級(jí) API 來訪問桌面和移動(dòng)系統(tǒng)的各種服務(wù)。
PyQt5 是一套 Python 綁定 Digia QT5 應(yīng)用的框架。PyQt5 實(shí)現(xiàn)了一個(gè) Python模塊集,有 620 個(gè)類,6000 個(gè)函數(shù)和方法。
PyQt5 的優(yōu)點(diǎn)是簡單好用,功能強(qiáng)大, 跨平臺(tái)支持,文檔齊全,穩(wěn)定性高,生態(tài)支持,開源免費(fèi),非常適合圖形界面軟件的設(shè)計(jì)與開發(fā)。
6.1.1 PyQt5 與 QtTools的安裝與環(huán)境配置
1. 安裝 PyQt5:
通過 pip 安裝PyQt5,安裝 PyQt5 后就可以用 Python 編寫 Qt 程序。
pip install pyqt5 -i https://mirrors.aliuyun.com/pypi/simple
安裝了 PyQt5 就可以用 Python 語言編寫 Qt 程序。
2. 安裝 QtTools:
QtDesigner 通過人機(jī)交互的排版方式進(jìn)行界面設(shè)計(jì),非常方便、直觀。
QtTools 包含了兩個(gè)重要的工具:
- 圖形界面設(shè)計(jì)工具 Qt Designer,用于設(shè)計(jì)圖形界面,生成 .ui文件,以 xml 格式存儲(chǔ)界面和控件的屬性;
- UI 文件轉(zhuǎn)換工具 PyUic,用于將 .ui 文件解析為 .py 文件的工具。
Qt Tools 工具可以直接使用 pip 方式安裝:
pip install pyqt5-tools -i https://mirrors.aliuyun.com/pypi/simple
3.QtDesigner 和PyUIC 的環(huán)境配置 :
使用 PyCharm 集成開發(fā)工具,在安裝 QtTools 庫以后,還要對(duì) QtDesigner 和 PyUIC 進(jìn)行環(huán)境配置,將其集成到 PyCharm 中。
(1)添加 QtDesigner 工具:
運(yùn)行 PyCharm;從菜單欄選擇:File -> Settings,彈出 Seetings 窗口;從左側(cè)菜單欄中選擇:Tools -> ExternalTools-> CreateTool 窗口。在 CreateTool 窗口依次填寫:
- Name:填寫 “QtDesigner”
- Program:填寫 designer.exe 的路徑,例如:
C:\Python\ \qt5_applications\Qt\bin \designer.exe - Arguments:不用填寫
- Working directory:填寫生成 UI 文件的保存路徑
填好 CreateTool 窗口后,點(diǎn)擊 “OK” 即可完成 QtDesigner 工具的添加。
(2)添加 PyUIC 工具:
運(yùn)行 PyCharm;從菜單欄選擇:File -> Settings,彈出 Settings 窗口;從左側(cè)菜單欄中選擇:Tools -> ExternalTools-> PyUIC 窗口。在 PyUIC 窗口依次填寫:
- Name:填寫 “PyUIC”
- Program:填寫 python.exe 的路徑,例如:C:\Python\Anaconda3\python.exe
- Arguments:填寫"-m PyQt5.uic.pyuic FileNameFileNameFileName -o FileNameWithoutExtensionFileName Without ExtensionFileNameWithoutExtension.py"
- Working directory:填寫將 .ui 文件轉(zhuǎn)換為 .py 文件的保存路徑。
填好 PyUIC 窗口后,點(diǎn)擊 “OK” 完成 PyUIC 工具的添加。
6.1.2 QtDesigner的使用
使用 QtDesigner 開發(fā) PyQt5 圖形界面的基本步驟是:
(1)使用圖形界面設(shè)計(jì)工具 QtDesigner 進(jìn)行界面設(shè)計(jì),生成 .ui 文件;
(2)使用 UI 轉(zhuǎn)換工具 PyUIC 將 .ui 文件轉(zhuǎn)換為 .py 文件;
(3)編寫一個(gè) Python 應(yīng)用程序調(diào)用 .py 界面文件,就可以實(shí)現(xiàn) Python 平臺(tái)的 GUI 編程。
使用 QtDesigner 進(jìn)行圖形界面設(shè)計(jì)的基本步驟是:
(1)運(yùn)行 PyCharm,打開建立的 Python Project。
(2)從頂部菜單欄選擇 QtDesigner,彈出 QtDesigner 運(yùn)行窗口。
(3)新建窗體:在 “新建窗體” 窗口的左側(cè)菜單選擇 “MainWindow” 新建一個(gè)圖形窗口。
(4)設(shè)計(jì)圖形界面。
QtDesigner 主界面分左中右三部分,左側(cè)是各種備選的控件對(duì)象,右側(cè)上方的 “對(duì)象查看器” 顯示控件的樹狀結(jié)構(gòu),右側(cè)下方的 “屬性編輯器” 顯示控件的各種屬性,中間部分用于顯示所設(shè)計(jì)的界面。
接下來可以按照界面設(shè)計(jì)方案,為新建的圖形窗口添加和設(shè)置圖形控件。
(5)將設(shè)計(jì)的圖形界面保存為 .ui文件,例如保存為 uiDemo.ui。
圖6.1 QtDesigner 圖形設(shè)計(jì)界面
圖6.2 PyUIC 文件轉(zhuǎn)換工具
6.1.3 信號(hào)與槽的連接
信號(hào)與槽機(jī)制(Signals and slots)是 PyQt 的核心機(jī)制,用于對(duì)象之間的通信,也就是實(shí)現(xiàn)函數(shù)之間的自動(dòng)調(diào)用。
1. 信號(hào)與槽的原理
將信號(hào)與槽函數(shù)連接后,當(dāng)信號(hào)被觸發(fā)時(shí),槽函數(shù)將被自動(dòng)調(diào)用。
- 信號(hào):信號(hào)可以是一個(gè)動(dòng)作,也可以是對(duì)象的一種狀態(tài),用于觸發(fā)所連接的槽。
- 槽:槽就是一個(gè)函數(shù),可以由連接的信號(hào)觸發(fā)。
- 發(fā)射信號(hào):信號(hào)被發(fā)射時(shí),自動(dòng)調(diào)用信號(hào)連接的槽函數(shù),通常在對(duì)象狀態(tài)改變時(shí)發(fā)射信號(hào)。
一個(gè)信號(hào)可以連接多個(gè)槽函數(shù),多個(gè)信號(hào)也可以連接到一個(gè)槽函數(shù),一個(gè)信號(hào)可以連接到另一個(gè)信號(hào)上。
很多窗口部件(控件)內(nèi)置了動(dòng)作信號(hào)和槽函數(shù)可以直接調(diào)用,也可以按需求自定義信號(hào)和槽函數(shù)。
信號(hào)的發(fā)送者通常是一個(gè)控件對(duì)象,在控件對(duì)象的狀態(tài)發(fā)生變化時(shí)發(fā)送信號(hào)。常見的發(fā)送者是圖形窗口中的各種控件對(duì)象,但也可以是動(dòng)作對(duì)象。
槽的接收者可以是控件對(duì)象,控件對(duì)象內(nèi)置槽函數(shù),也可以是自定義的槽函數(shù)。一般地,槽函數(shù)也有一個(gè)對(duì)象作為主體,即對(duì)于接受者這個(gè)控件對(duì)象執(zhí)行函數(shù)定義的操作。例如槽函數(shù)執(zhí)行的功能是關(guān)閉,關(guān)閉對(duì)象就是接受者。
根據(jù)信號(hào)的發(fā)送者與接收者,槽函數(shù)的,可以將信號(hào)與槽的連接分為以下幾種情況:
(1)不同的發(fā)送者與接收者,槽函數(shù)為控件的內(nèi)置函數(shù)的操作方法;
(2)不同的發(fā)送者與接收者,槽函數(shù)為自定義函數(shù);
(3)相同的發(fā)送者與接收者,槽函數(shù)為控件的內(nèi)置函數(shù);
(4)發(fā)送者是動(dòng)作對(duì)象。
2. QtDesigner 建立信號(hào)與槽的連接
QtDesigner 設(shè)置信號(hào)/槽的連接的操作,可以選擇菜單進(jìn)入信號(hào)/槽編輯模式,通過鼠標(biāo)分別選擇信號(hào)與槽的控件對(duì)象,建立一個(gè)以控件對(duì)象1為發(fā)送者、控件對(duì)象2為接收者的信號(hào)/槽連接,再配置該信號(hào)與槽的連接。這種方法適合使用控件內(nèi)置的方法作為槽函數(shù),可以直接調(diào)用,不需要對(duì)函數(shù)進(jìn)行定義。
程序核心功能通常是程序員根據(jù)需求編寫的自定義函數(shù),QtDesigner 對(duì)這種情況提供了便捷和直觀的信號(hào)/槽編輯方法。
圖6.3 建立信號(hào)與控件內(nèi)置槽函數(shù)的連接
圖6.4 建立信號(hào)與自定義槽函數(shù)的連接
?
(1)首先要在 QtDesigner 將自定義函數(shù)添加到槽函數(shù)配置連接表中。
在 QtDesigner 右側(cè)上方的 “對(duì)象查看器”,選中 MainWindow 或其它頂層對(duì)象,單擊鼠標(biāo)右鍵喚出下拉菜單,選擇 “改變信號(hào)/槽”;
彈出 “MainWindow 的信號(hào)/槽” 對(duì)話框,對(duì)話框的上方顯示槽的選項(xiàng),下方顯示信號(hào)選項(xiàng)。
點(diǎn)擊對(duì)話框上方 “槽” 選項(xiàng)框下部的綠色 “+”,系統(tǒng)在 “槽” 選項(xiàng)表的最后自動(dòng)增加了一行 “slot1()”。這就是新增的自定義槽函數(shù)。
點(diǎn)擊選中 “slot1()”,再鼠標(biāo)雙擊,就可以修改槽函數(shù)的函數(shù)名,例如修改為 click_pushButton_2()。
再點(diǎn)擊對(duì)話框上方 “槽” 選項(xiàng)框下部的綠色 “+”,可以繼續(xù)逐一添加自定義的槽函數(shù)
(2)然后設(shè)置信號(hào)/槽的連接:
選中控件對(duì)象發(fā)送者,長按鼠標(biāo)左鍵并移動(dòng),當(dāng)鼠標(biāo)移出控件對(duì)象區(qū)域后,出現(xiàn)一條帶箭頭的紅線和一個(gè)紅色的接地符號(hào)。
松開鼠標(biāo)左鍵,就建立了以控件對(duì)象 “pushButton_2” 為發(fā)送者、控件對(duì)象 “MainWindow” 為接收者的信號(hào)/槽連接。
(3)最后配置信號(hào)/槽的連接:
對(duì)話框 "配置連接 - QtDesigner"的左側(cè)顯示發(fā)送者控件 “pushButton_2” 的信號(hào)選項(xiàng),右側(cè)顯示接收者 “MainWindow” 的控件選項(xiàng)。
根據(jù)功能要求,觸發(fā)信號(hào)為按鈕 “pushButton_2” 被點(diǎn)擊,從對(duì)話框左側(cè)選中 “clicked()”;
對(duì)話框右側(cè)接收者 “MainWindow” 的控件選項(xiàng)列表中,顯示了剛才添加的幾個(gè)自定義函數(shù),選擇 “click_pushButton_2()”;
點(diǎn)擊對(duì)話框下方的按鈕 “OK”,完成該信號(hào)/槽連接的配置。
6.1.4 PyQt5 的控件、布局與窗口切換
1. 控件
控件是 Qt用戶界面上最基本的組件類型,也是構(gòu)成用戶界面的基本結(jié)構(gòu)。
用戶界面上顯示的所有內(nèi)容都是控件,例如按鈕、標(biāo)簽、文本框,又如菜單欄、工具欄、狀態(tài)欄,甚至整個(gè)窗口本身也是控件。
控件總體上可以分類如下:
- 輸入控件:按鈕,鍵盤輸入控件,調(diào)節(jié)輸入控件,數(shù)字調(diào)節(jié)框控件,滑動(dòng)輸入控件,下拉輸入控件,對(duì)話框輸入控件,日歷控件等;
- 顯示控件:內(nèi)容顯示控件,對(duì)話框顯示控件等;
- 高級(jí)控件:容器控件,結(jié)構(gòu)控件,滾動(dòng)控件,輔助控件,其它控件等。
在 QtDesigner 左側(cè)的 “WidgetBox” 工具欄中,將常用的控件按類別進(jìn)行分組。用鼠標(biāo)將工具欄中的控件圖標(biāo)拖拽到 QtDesigner 中間的圖形界面編輯窗口,就在圖像界面創(chuàng)建了一個(gè)所選擇的控件。
控件具有屬性。控件的相同屬性包括:名字,形狀,位置,大小,設(shè)置格式。控件的專用屬性包括:展示內(nèi)容,接受輸入,用戶交互,日期,框架,等等。
QtDesigner 右側(cè)上方的 “對(duì)象查看器” 顯示了界面中的控件名稱和結(jié)構(gòu),下方的 “屬性編輯器” 顯示了選中的控件對(duì)象的各種屬性。在圖形界面中選擇某個(gè)控件,或者在 “對(duì)象查看器” 中選擇某個(gè)控件,在"屬性編輯器" 就會(huì)顯示該控件對(duì)象的屬性,也可以根據(jù)需要對(duì)控件的屬性進(jìn)行編輯修改。
2. 布局管理
布局管理就是管理圖形窗口中各個(gè)部件的位置和排列。
網(wǎng)站、報(bào)紙要對(duì)發(fā)布的文章設(shè)置欄目、布局管理,使頁面整齊有序、美觀大方。圖形窗口中的大量部件也需要通過布局管理,對(duì)部件進(jìn)行整理分組、排列定位,才能使界面友好。
圖形窗口中部件的位置有兩種模式來管理:絕對(duì)定位和布局類。
絕對(duì)定位就是指定部件相當(dāng)于窗口的位置坐標(biāo) (X,Y) 和部件的高度、寬度。我們?cè)诖饲拔恼轮械睦?#xff0c;都是直接設(shè)置控件的位置和大小來管理的。
布局類則是使用各種布局方案進(jìn)行布局管理。
PyQt5 提供了四種基本的布局管理器:水平布局、垂直布局、柵格布局和表單布局。
- 水平布局(Horizontal Layout)將多個(gè)控件在水平方向排列,控件之間的間隔相同。
- 垂直布局(Vertical Layout)將多個(gè)控件在垂直方向排列,控件之間的間隔相同。
- 柵格布局(Grid Layout)也稱網(wǎng)格布局,布局框按照行和列進(jìn)行排列,將控件排列到指定的網(wǎng)格位置。
- 表格布局(Form Layout)以兩列的形式進(jìn)行布局,多用于表單,一列為標(biāo)簽,另一列為輸入控件。
PyQt5 還提供了多種高級(jí)的的布局管理器: - 嵌套布局是指在一個(gè)布局內(nèi)嵌套其它布局,可以實(shí)現(xiàn)在一個(gè)窗口中綜合應(yīng)用多種布局。
- 容器布局將容器控件(Container)與布局管理器結(jié)合,先用容器控件將窗口分為若干區(qū)域,再在每個(gè)區(qū)域內(nèi)加入布局管理器。
?
圖6.5 程序窗口的分割和布局管理
圖6.6 堆疊布局實(shí)現(xiàn)的多窗口切換
?
容器布局就像網(wǎng)站、報(bào)刊中的欄目、子版,可以按照編輯的要求便捷、自由地進(jìn)行布局。例如,我們要將程序窗口按照十字分割方案分為上下和左右四個(gè)部分,就在窗口先創(chuàng)建四個(gè) “Frame” 容器控件,并調(diào)整其位置和大小,然后向一個(gè)或幾個(gè) “Frame” 容器控件加入所需的布局管理控件。如下圖所示,可以實(shí)現(xiàn)對(duì)程序窗口的自由分割和布局。
3. 窗口切換
在實(shí)際的軟件項(xiàng)目中,通常需要多種/多個(gè)不同的圖形界面,以適應(yīng)不同的任務(wù)場景。
實(shí)現(xiàn)多窗口圖形界面的需求有幾種思路:
(1)使用彈出窗口。主窗口提供基本界面,通過彈出窗口實(shí)現(xiàn)子任務(wù)界面,子任務(wù)結(jié)束后關(guān)閉彈出窗口回到主窗口。這是一種可行的,也比較簡單的處理方案,很多應(yīng)用程序中都設(shè)有彈出窗口。但是頻繁彈出和關(guān)閉窗口的用戶體驗(yàn)不好,而且在窗口之間的切換不方便。
(2)重建圖形界面。當(dāng)調(diào)用新的圖形界面時(shí),關(guān)閉后刪除現(xiàn)有界面上的所有控件,再新建需要的各種控件。 這種方案雖然可行,但是編程復(fù)雜、浪費(fèi)資源、容易出錯(cuò),難以適應(yīng)多窗口相互切換的要求,因此很少使用。在 QtDesigner 中也不支持這種方案的操作。
(3)通過堆疊布局實(shí)現(xiàn)多窗口切換。堆疊布局是在窗口的整體或局部區(qū)域設(shè)置多組圖形界面,根據(jù)需要使用指定的圖形界面。這就好比戲劇或拍照中準(zhǔn)備了多種背景幕布,需要什么場景,就展開所需的場景幕布,而把其它幕布收起來。
QStackedLayout 類提供了幾種多頁面切換堆疊布局的實(shí)現(xiàn)方法:
(1)選項(xiàng)卡控件(QTackedWidget)提供了選項(xiàng)卡對(duì)話框,外觀類似于瀏覽器頁面打開多個(gè)標(biāo)簽頁。選項(xiàng)卡控件允許創(chuàng)建多個(gè)對(duì)話框頁面,每個(gè)頁面帶有自己的標(biāo)簽。使用時(shí)點(diǎn)擊標(biāo)簽行進(jìn)行選擇,就打開對(duì)應(yīng)的對(duì)話框頁面,不需要另外編程。
(2)堆疊窗口控件(QStackedWidget)提供了更加通用和靈活的多窗口、多頁面切換的解決方案。堆疊窗口控件可以添加在整個(gè)窗口或窗口中的任意區(qū)域,允許在堆疊窗口區(qū)域內(nèi)設(shè)計(jì)多個(gè)頁面,在程序控制使用指定的窗口界面。
堆疊窗口控件需要在主程序中通過編程來控制顯示的圖形界面,相對(duì)于選項(xiàng)卡控件來說比較復(fù)雜,但因此也更加靈活。
【本節(jié)完】
版權(quán)聲明:
本節(jié)內(nèi)容,主要來自:Image Matting 客觀評(píng)價(jià)指標(biāo)、數(shù)據(jù)集及主觀評(píng)價(jià)(https://blog.csdn.net/Mao_Jonah/article/details/113646709)
歡迎關(guān)注『Python 小白的項(xiàng)目實(shí)戰(zhàn) @ youcans』 原創(chuàng)作品
原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:https://blog.csdn.net/youcans/article/details/122296231
Copyright 2022 youcans, XUPT
Crated:2022-01-09
歡迎關(guān)注『Python 小白的項(xiàng)目實(shí)戰(zhàn) @ youcans』 原創(chuàng)作品
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(1)目錄摘要
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(2)摳圖緒論
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(3)摳圖綜述
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(4)固定閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(5)自適應(yīng)閾值摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(6)色彩范圍摳圖
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(7)邊緣檢測
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(8)圖像輪廓
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(9)評(píng)價(jià)指標(biāo)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(10)PyQt5 使用
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(11)算法實(shí)驗(yàn)平臺(tái)
Python 小白的課題報(bào)告—OpenCV 摳圖項(xiàng)目實(shí)戰(zhàn)(12)源程序代碼
總結(jié)
以上是生活随笔為你收集整理的【课题报告】OpenCV 抠图项目实战(10)PyQt5 使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV 例程200篇】92. 指
- 下一篇: C++不同数据类型的转换