PyQt5番外篇(2-2):沖頂大會語音答題輔助小工具之解析篇——界面搭建
寫在前面
我是來兌現承諾的。。。。
所以,相互理解吧!
Ready? Go!
視頻中的語音答題小工具本質上可以理解成一個基於Python的語音識別小工具。那麼問題來了怎麼實現的?
實現思路
解決問題的思路在於抽絲剝繭!
我覺得可以分解成以下幾個階段:
- 界面搭建
- 語音採集
- 語音識別
- 問題搜索
實現每個階段的功能,然後一整合,整個程序就實現了。
好的,我計劃用3到4章描述整個實現過程!
納尼!就這要3到4章來描述!
沒錯,就是要這麼多!這就是我的行文風格,不要文字的堆砌,但求精品,力爭能夠更好的理解!
今天先來說一說界面的搭建!
界面搭建
有人問我:這樣的工具為什麼要用UI界面,不要這個我一樣可以用?的確,但是加上這個界面後感覺會更加人性化,使用更方便!
界面雖然簡陋,但是夠實用啊!利用Qt設計師,我們拖拖拽拽實現了這個界面。由於使用圖文描述,文字較多,理解不便。我採用錄屏的方式。這個界面與上期視頻中的界面略有不同,可以自定義錄音時間。
https://www.zhihu.com/video/937613480015241216沖頂大會UI設計(請選擇超清模式)
如果對Qt設計師不太熟悉的,請參考:
我想飛:PyQt5系列教程(2):拖拖拽拽寫程序我想飛:PyQt5系列教程(7):界面搭建注意事項
通過Qt設計師與Eric6我們實現了界面。個人覺得這裡有兩點需要注意:
- 通過Eric6創建對話框代碼,也就是下面這個步驟,通過這個步驟能夠幫助我們快速實現信號與槽的調用。
- 勾選我們需要產生的信號的小部件以及信號類型。
下面我們來了解一下創建的對話框代碼的含義(部分核心代碼)
from PyQt5.QtCore import pyqtSlotnfrom PyQt5.QtWidgets import QDialog, QApplicationnfrom Ui_ui import Ui_Dialognimport sysnnclass Dialog_voice(QDialog, Ui_Dialog):nn def __init__(self, parent=None):nn super(Dialog_voice, self).__init__(parent)n self.setupUi(self)nn @pyqtSlot(int)n def on_spinBox_valueChanged(self, p0):n """n Slot documentation goes here.nn @param p0 DESCRIPTIONn @type intn """n # TODO: not implemented yetn print(boxbox)n n @pyqtSlot()n def on_pushButton_clicked(self):n """n Slot documentation goes here.n """n # TODO: not implemented yetn print(btbt)n
這些代碼大部分是Eric6自動生成的。
from PyQt5.QtCore import pyqtSlotn
PyQt5允許在連接信號時將任何Python調用用作槽函數,但有時需要顯式地將Python方法標記為Qt槽函數,PyQt5提供了pyqtSlot()函數裝飾器來完成此操作。
from Ui_ui import Ui_Dialogn
從我們的Ui_ui.py文件中導入我們的UI類Ui_Dialog
class Dialog_voice(QDialog, Ui_Dialog):n
看到沒有,Eric6為我們建立的對話框代碼Dialog_voice繼承了QDialog、Ui_Dialog,所以我們能夠操作UI中的小部件。
@pyqtSlot(int)n def on_spinBox_valueChanged(self, p0):n """n Slot documentation goes here.nn @param p0 DESCRIPTIONn @type intn """n # TODO: not implemented yetn print(boxbox)nn @pyqtSlot()n def on_pushButton_clicked(self):n """n Slot documentation goes here.n """n # TODO: not implemented yetn print(btbt)n
顯性的調用槽函數需要使用@pyqtSlot()這個裝飾器。話說裝飾器是什麼東東?裝飾器在Python中是一個非常重要的概念,裝飾器這個概念就可以寫好幾章的,這個不是我們本章的重點。所以我們主要講解@pyqtSlot()的作用。
PyQt5.QtCore.pyqtSlot(types [,name [,result [,revision = 0]]])n
我們使用@pyqtSlot()來創建一個槽函數。
參數:
- types - 定義槽函數的C ++簽名的類型。 每種類型可能是一個Python類型的對象,或者是一個C ++類型名稱的字元串。
- name - C ++將看到的插槽的名稱。 如果省略,將使用正在裝飾Python方法的名稱。 這隻能作為關鍵字參數給出。
- revision - 導出到QML的槽函數的修訂版本。 這隻能作為關鍵字參數給出。
- result - 結果的類型,可能是Python類型對象或指定C ++類型的字元串。 這隻能作為關鍵字參數給出。
使用這個的好處是什麼呢?將一個信號連接到裝飾過Python方法能夠減少使用的內存數量和稍微快一點。
在這裡我們主要實現兩個目的:
- 點擊按鈕,採集問題
- 修改微調框數字修改錄音時長,其中微調框返回值的int類型的。
最後一個問題
為什麼我點擊了按鈕或者調整了微調框,就會調用相應的槽函數呢?
現在我們回過頭來,看看我們UI中寫的語句,在Ui_Dialog類中有這麼一句:
QtCore.QMetaObject.connectSlotsByName(Dialog)n
這段代碼就是說以遞歸方式搜索給定對象的所有子對象,並將來自它們的匹配信號連接到遵循以下形式的對象的槽函數中:
def on_ <object name> _ <signal name>(<signal parameters>):n
假設我們的對象有一個QPushButton類型的子對象,其對象名為button1。捕獲按鈕的clicked()信號的槽函數是:
def on_button1_clicked(self):n
如果對象本身具有正確設置的對象名稱,則它自己的信號也連接到其各自的槽函數。
所以這就解釋了為什麼我點擊按鈕的時候會調用對應的槽函數了。
ok,今天的界面搭建的介紹暫時就到這裡吧,下期我們再見。如果你喜歡本篇文章,請給我
點贊
讚賞(推薦)
分享給你的好友們吧!
如果你想要提前體驗一下本次的UI代碼,請關注微信公眾號:學點編程吧,發送pyqt5cdui,會自動得到相應的百度網盤下載鏈接。
推薦閱讀:
※PyQt5系列教程(6):布局
※教程 | pyqt5極速打包界面軟體
※PyQt5系列教程(15):單選按鈕
※PyQt5系列教程(18):微調框1
※PyQt5系列教程(21):標籤(QLabel)