PyQt5番外篇(2-2):沖頂大會語音答題輔助小工具之解析篇——界面搭建

寫在前面

我是來兌現承諾的。。。。

所以,相互理解吧!

Ready? Go!

視頻中的語音答題小工具本質上可以理解成一個基於Python的語音識別小工具。那麼問題來了怎麼實現的?

實現思路

解決問題的思路在於抽絲剝繭!

我覺得可以分解成以下幾個階段:

  1. 界面搭建
  2. 語音採集
  3. 語音識別
  4. 問題搜索

實現每個階段的功能,然後一整合,整個程序就實現了。

好的,我計劃用3到4章描述整個實現過程!

納尼!就這要3到4章來描述!

沒錯,就是要這麼多!這就是我的行文風格,不要文字的堆砌,但求精品,力爭能夠更好的理解!

今天先來說一說界面的搭建!

界面搭建

有人問我:這樣的工具為什麼要用UI界面,不要這個我一樣可以用?的確,但是加上這個界面後感覺會更加人性化,使用更方便!

界面雖然簡陋,但是夠實用啊!利用Qt設計師,我們拖拖拽拽實現了這個界面。由於使用圖文描述,文字較多,理解不便。我採用錄屏的方式。這個界面與上期視頻中的界面略有不同,可以自定義錄音時間。

https://www.zhihu.com/video/937613480015241216

沖頂大會UI設計(請選擇超清模式)

如果對Qt設計師不太熟悉的,請參考:

我想飛:PyQt5系列教程(2):拖拖拽拽寫程序zhuanlan.zhihu.com圖標我想飛:PyQt5系列教程(7):界面搭建zhuanlan.zhihu.com圖標

注意事項

通過Qt設計師與Eric6我們實現了界面。個人覺得這裡有兩點需要注意:

  1. 通過Eric6創建對話框代碼,也就是下面這個步驟,通過這個步驟能夠幫助我們快速實現信號與槽的調用。
  2. 勾選我們需要產生的信號的小部件以及信號類型。

下面我們來了解一下創建的對話框代碼的含義(部分核心代碼)

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.pyqtSlottypes [,name [,result [,revision = 0]]]n

我們使用@pyqtSlot()來創建一個槽函數。

參數:

  • types - 定義槽函數的C ++簽名的類型。 每種類型可能是一個Python類型的對象,或者是一個C ++類型名稱的字元串。
  • name - C ++將看到的插槽的名稱。 如果省略,將使用正在裝飾Python方法的名稱。 這隻能作為關鍵字參數給出。
  • revision - 導出到QML的槽函數的修訂版本。 這隻能作為關鍵字參數給出。
  • result - 結果的類型,可能是Python類型對象或指定C ++類型的字元串。 這隻能作為關鍵字參數給出。

使用這個的好處是什麼呢?將一個信號連接到裝飾過Python方法能夠減少使用的內存數量和稍微快一點。

在這裡我們主要實現兩個目的:

  1. 點擊按鈕,採集問題
  2. 修改微調框數字修改錄音時長,其中微調框返回值的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)

TAG:PyQt | Python | 冲顶大会 |