1. 信號(hào)與槽(Signals and slots)
信號(hào)與槽機(jī)制是 PyQt 的核心機(jī)制,用于對(duì)象之間的通信,也就是實(shí)現(xiàn)函數(shù)之間的自動(dòng)調(diào)用。
1.1 信號(hào)與槽的原理
簡(jiǎn)單地說(shuō),將信號(hào)與槽函數(shù)連接后,當(dāng)信號(hào)被觸發(fā)時(shí),槽函數(shù)將被自動(dòng)調(diào)用。
分析這個(gè)過(guò)程,涉及到幾個(gè)基本概念和關(guān)系:
信號(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)。
信號(hào)可以帶有參數(shù),但必須與槽函數(shù)的參數(shù)相對(duì)應(yīng)。
一個(gè)信號(hào)可以連接多個(gè)槽函數(shù),多個(gè)信號(hào)也可以連接到一個(gè)槽函數(shù)。
一個(gè)信號(hào)可以連接到另一個(gè)信號(hào)上。
很多窗口部件(控件)內(nèi)置了一下信號(hào)和槽,可以直接調(diào)用。也可以按需求自定義信號(hào)和槽。
1.2 信號(hào)發(fā)送者與槽的接收者
信號(hào)的發(fā)送者通常是一個(gè)控件對(duì)象,在控件對(duì)象的狀態(tài)發(fā)生變化時(shí)發(fā)送信號(hào)。常見(jiàn)的發(fā)送者是圖形窗口中的各種控件對(duì)象,但也可以是動(dòng)作對(duì)象。
槽的接收者通常也是控件對(duì)象。槽函數(shù)是一個(gè)自定義的槽函數(shù),或控件內(nèi)置的槽函數(shù)。一般地,槽函數(shù)也有一個(gè)對(duì)象作為主體,即對(duì)于接受者這個(gè)控件對(duì)象執(zhí)行函數(shù)定義的操作。例如槽函數(shù)執(zhí)行的功能是關(guān)閉,哪么究竟是關(guān)閉那個(gè)控件呢?關(guān)閉對(duì)象就是接受者。
為了方便講解信號(hào)與槽的連接,我們用 QtDesigner 在上節(jié)設(shè)計(jì)的圖形窗口 uiDemo3.ui 的基礎(chǔ)上,增加幾個(gè)按鈕對(duì)象和文本行編輯對(duì)象:
打開(kāi) PyCharm,從 Tools -> ExternalTools -> QtDesigner 打開(kāi) QtDesigner,打開(kāi) uiDemo3.ui 文件。
鼠標(biāo)點(diǎn)擊選中 QtDesigner 左側(cè)控件欄 Buttons 中的 PushButton,按住鼠標(biāo)不放,將其拖動(dòng)到中間的圖形界面后松開(kāi)鼠標(biāo),就在圖形界面中創(chuàng)建了一個(gè) PushButton 控件。
鼠標(biāo)點(diǎn)擊選中 QtDesigner 左側(cè)控件欄 InputWidget 中的 LineEdit,按住鼠標(biāo)不放,將其拖動(dòng)到中間的圖形界面后松開(kāi)鼠標(biāo),就在圖形界面中創(chuàng)建了一個(gè) LineEdit 控件。
重復(fù)以上步驟,再建立幾個(gè) PushButton 控件和 LineEdit 控件。
- 注意在 QtDesigner 右側(cè) “對(duì)象查看器” 中所顯示的控件名稱和屬性,多個(gè) PushButton、LineEdit 被自動(dòng)賦予不同的命名(objectName),如:LineEdit_1、LineEdit_2、LineEdit_3,這就如同桌子有幾個(gè)抽屜分別標(biāo)記為 “抽屜1”、“抽屜2”、“抽屜3” 以便識(shí)別。
- 控件的名稱和其它屬性都可以在 “屬性編輯器” 中編輯修改。
鼠標(biāo)選中在圖形界面中創(chuàng)建的 PushButton 控件或 LineEdit 控件,可以拖動(dòng)控件調(diào)整位置。
鼠標(biāo)雙擊 PushButton 按鈕,可以編輯按鈕控件的標(biāo)簽即按鈕上的顯示內(nèi)容。
為了便于講解,本例將各 PushButton 控件的顯示內(nèi)容(text 屬性)修改為:“1# 按鈕” ~ “4# 按鈕”,將各 LineEdit 控件的顯示內(nèi)容(text 屬性)修改為:“文本編輯行-1” ~ “文本編輯行-3”。
將這個(gè)應(yīng)用程序圖形界面另存為 uiDemo4.ui,其預(yù)覽效果如下:
2. QtDesigner 建立信號(hào)與槽的連接
2.1 信號(hào)與槽的連接:不同的發(fā)送者與接收者,槽函數(shù)為控件的內(nèi)置函數(shù)
QtDesigner 提供了便捷和直觀的信號(hào)/槽編輯方法。
本例介紹不同的發(fā)送者與接收者,槽函數(shù)為控件的內(nèi)置函數(shù)的操作方法。不同類型的控件分別內(nèi)置了若干方法,例如 QPushButton 控件內(nèi)置的方法包括:點(diǎn)擊、選中、狀態(tài)變化、顯示菜單等,而 QLineEdit 控件內(nèi)置的方法包括:清空、復(fù)制、剪切、粘貼、全選、撤銷(xiāo)操作等。使用控件內(nèi)置的方法作為槽函數(shù),可以直接調(diào)用,不需要對(duì)函數(shù)進(jìn)行定義。
我們所設(shè)計(jì)的功能是:當(dāng)點(diǎn)擊按鈕控件 “pushButton_1” 時(shí),清空文本編輯控件 “lineEdit_1” 的顯示內(nèi)容。注意我們稱按鈕控件為 “lineEdit_1” 而不是 “文本編輯行-1”,這是因?yàn)?lineEdit_1 才是控件名稱,在程序中是不變的,而 “文本編輯行-1” 只是顯示內(nèi)容,可以在程序中修改。
QtDesigner 設(shè)置信號(hào)/槽的連接的操作步驟如下:
(1)選擇菜單項(xiàng) “Edit” -> 編輯信號(hào)/槽,或者通過(guò)快捷鍵 F4 或在工具欄選擇,進(jìn)入信號(hào)/槽編輯模式。
(2)選中控件對(duì)象發(fā)送者,此處為按鈕控件 “pushButton_1”,鼠標(biāo)左鍵長(zhǎng)按不放,該按鈕控件變?yōu)闇\紅色。
- 鼠標(biāo)左鍵繼續(xù)長(zhǎng)按不放,并移動(dòng)鼠標(biāo),當(dāng)鼠標(biāo)移出控件對(duì)象區(qū)域后,出現(xiàn)一條帶箭頭的紅線和一個(gè)紅色的接地符號(hào)。
- 鼠標(biāo)左鍵繼續(xù)長(zhǎng)按不放,并拖動(dòng)鼠標(biāo)到控件對(duì)象 “lineEdit_1”,松開(kāi)鼠標(biāo)左鍵,就建立了以控件對(duì)象 “pushButton_1” 為發(fā)送者、控件對(duì)象 “lineEdit_1” 為接收者的信號(hào)/槽連接。
- 此時(shí)控件對(duì)象 “pushButton_1” 和 “lineEdit_1” 都變?yōu)闇\紅色,帶箭頭的紅線從 “pushButton_1” 出發(fā),指向 “lineEdit_1” 結(jié)束。
(3)同時(shí)彈出對(duì)話框 “配置連接 - QtDesigner”,對(duì)話框的左側(cè)顯示發(fā)送者控件的信號(hào)選項(xiàng),對(duì)話框的右側(cè)顯示接收者的控件選項(xiàng)。
- 根據(jù)功能要求,觸發(fā)信號(hào)為按鈕 “pushButton_1” 被點(diǎn)擊,從對(duì)話框左側(cè)選中 “clicked()”;
- 根據(jù)功能要求,收到信號(hào)后動(dòng)作是清空文本編輯控件 “lineEdit_1”,從對(duì)話框右側(cè)選中 “clear()”;
- 點(diǎn)擊對(duì)話框下方的按鈕 “OK”,完成該信號(hào)/槽連接的配置。
2.2 信號(hào)與槽的連接:不同的發(fā)送者與接收者,槽函數(shù)為自定義函數(shù)
本例介紹不同的發(fā)送者與接收者,槽函數(shù)為自定義函數(shù)的操作方法。
在 2.1 中介紹了使用控件內(nèi)置的方法作為槽函數(shù),可以直接調(diào)用,不需要對(duì)函數(shù)進(jìn)行定義。程序設(shè)計(jì)中的核心功能通常是程序員根據(jù)需求開(kāi)發(fā)的自定義函數(shù)。使用自定義函數(shù)作為槽函數(shù),一方面當(dāng)然是要編寫(xiě)自定義函數(shù),另一方面要將自定義函數(shù)添加到槽函數(shù)配置連接表中。
我們所設(shè)計(jì)的功能是:
當(dāng)點(diǎn)擊按鈕控件 “pushButton_2” 時(shí),清空文本編輯控件 “lineEdit_2” 的顯示內(nèi)容,并顯示文本信息 “current signal: click pushButton_2”。
在主程序中要編寫(xiě)一個(gè)自定義函數(shù)實(shí)現(xiàn)該功能,將該自定義函數(shù)命名為 click_pushButton_2()。
注意我們編寫(xiě)的自定義函數(shù) click_pushButton_2(),雖然功能只是對(duì)文本編輯控件 “lineEdit_2” 進(jìn)行操作,但對(duì)于自定義函數(shù)也可以完成任意的其它功能,對(duì)其它控件按照控件名稱進(jìn)行操作。因此該槽函數(shù)的接收者并不是文本編輯控件 “lineEdit_2”,而是主窗口控件 “MainWindow”。
QtDesigner 設(shè)置信號(hào)/槽的連接的操作步驟如下:
首先要在 QtDesigner 將自定義函數(shù)添加到槽函數(shù)配置連接表中――非常重要。
網(wǎng)上的很多文章都沒(méi)有講具體實(shí)現(xiàn)方法,這個(gè)操作的入口也很難找到。
(1)在 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ù)。
然后設(shè)置信號(hào)/槽的連接:
(2)選擇菜單項(xiàng) “Edit” -> 編輯信號(hào)/槽,或者通過(guò)快捷鍵 F4 或在工具欄選擇,進(jìn)入信號(hào)/槽編輯模式。
- 選中控件對(duì)象發(fā)送者,此處為按鈕控件 “pushButton_2”,長(zhǎng)按鼠標(biāo)左鍵并移動(dòng),當(dāng)鼠標(biāo)移出控件對(duì)象區(qū)域后,出現(xiàn)一條帶箭頭的紅線和一個(gè)紅色的接地符號(hào)。
- 松開(kāi)鼠標(biāo)左鍵,就建立了以控件對(duì)象 “pushButton_2” 為發(fā)送者、控件對(duì)象 “MainWindow” 為接收者的信號(hào)/槽連接。此時(shí)控件對(duì)象 “pushButton_2” 變?yōu)闇\紅色,帶箭頭的紅線從 “pushButton_2” 出發(fā),并不指向其它控件,而是以一個(gè)接地符號(hào)結(jié)束。
(3)同時(shí)彈出對(duì)話框 “配置連接 - QtDesigner”,對(duì)話框的左側(cè)顯示發(fā)送者控件 “pushButton_2” 的信號(hào)選項(xiàng),對(duì)話框的右側(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)/槽連接的配置。
最后,別忘了要在主程序中編寫(xiě)自定義的函數(shù)。但這已不屬于 QtDesigner 設(shè)計(jì)的內(nèi)容了,在此不再詳述。
類似地,我們?cè)O(shè)計(jì):當(dāng)點(diǎn)擊按鈕控件 “pushButton_3” 時(shí),在文本編輯控件 "lineEdit_1"顯示當(dāng)前系統(tǒng)日期,在文本編輯控件 "lineEdit_2"顯示當(dāng)前系統(tǒng)時(shí)間,在文本編輯控件 “lineEdit_3” 顯示提示信息。在主程序中編寫(xiě)一個(gè)自定義函數(shù) click_pushButton_3(),并與 “pushButton_3” 建立信號(hào)/槽連接。
這表明:在自定義的子函數(shù)中,可以同時(shí)操作多個(gè)控件對(duì)象,進(jìn)而可以實(shí)現(xiàn)用戶定義的各種功能。
2.3 信號(hào)與槽的連接:相同的發(fā)送者與接收者,槽函數(shù)為控件的內(nèi)置函數(shù)
本例介紹相同的發(fā)送者與接收者,槽函數(shù)為控件的內(nèi)置函數(shù)的操作方法。
顧名思義,相同的發(fā)送者與接收者,就是說(shuō)信號(hào)的發(fā)送者與槽函數(shù)的接收者是同一個(gè)控件對(duì)象。這是什么情況?例如,一個(gè)開(kāi)關(guān)按鈕有 “On/Off” 兩種狀態(tài),每按一次則按鈕狀態(tài)發(fā)生翻轉(zhuǎn)。類似地,選項(xiàng)框也有選中、未選中兩種狀態(tài)。特殊地,點(diǎn)擊按鈕后,關(guān)閉該按鈕控件,也屬于相同的發(fā)送者與接收者。
我們首先將控件對(duì)象 “pushButton_4” 從按鈕控件 QPushButton 改變?yōu)?選項(xiàng)框控件 “QCheckBox”:
- 點(diǎn)擊控件對(duì)象 “pushButton_4”,控件對(duì)象的周?chē)吔顼@示幾個(gè)藍(lán)色小方塊;
- 點(diǎn)擊鼠標(biāo)右鍵喚出下拉菜單,選擇:“變型為” ->“QCheckBox”。
此時(shí),設(shè)計(jì)界面窗口中的按鈕控件,變成了一個(gè)選項(xiàng)框。同時(shí),右側(cè) “對(duì)象查看器” 中的控件 “pushButton_4”,也自動(dòng)變更為 “checkBox_4”。變更的控件 “checkBox_4” 繼承了原來(lái)控件 “pushButton_4” 的一些屬性,如:位置、尺寸、顯示內(nèi)容。
接下來(lái)設(shè)置信號(hào)/槽的連接:
(1)選擇菜單項(xiàng) “Edit” -> 編輯信號(hào)/槽,或者通過(guò)快捷鍵 F4 或在工具欄選擇,進(jìn)入信號(hào)/槽編輯模式。
(2)選中控件對(duì)象發(fā)送者,此處為按鈕控件 “checkBox_4”,長(zhǎng)按鼠標(biāo)左鍵并移動(dòng),當(dāng)鼠標(biāo)移出控件對(duì)象區(qū)域后,出現(xiàn)一條帶箭頭的紅線和一個(gè)紅色的接地符號(hào)。
- 長(zhǎng)按鼠標(biāo)左鍵,拖動(dòng)鼠標(biāo)再回到控件對(duì)象 “checkBox_4” 區(qū)域后松開(kāi)鼠標(biāo)左鍵,就建立了發(fā)送者和接收者都是控件對(duì)象 “checkBox_4” 的信號(hào)/槽連接。
- 此時(shí)控件對(duì)象 “checkBox_4” 變?yōu)闇\紅色,帶箭頭的紅線從 “checkBox_4” 出發(fā),又返回到 “checkBox_4” 結(jié)束。
(3)同時(shí)彈出了對(duì)話框 “配置連接 - QtDesigner”,對(duì)話框的左側(cè)和右側(cè)分別是控件對(duì)象 “checkBox_4” 的信號(hào)和槽函數(shù)。
- 從對(duì)話框左側(cè)選中 “clicked(bool)”;
- 從對(duì)話框右側(cè)選中 “setChecked(bool)”;
- 點(diǎn)擊對(duì)話框下方的按鈕 “OK”,完成該信號(hào)/槽連接的配置。
2.4 信號(hào)與槽的連接:發(fā)送者是動(dòng)作對(duì)象
常見(jiàn)的信號(hào)發(fā)送者是圖形窗口中的各種控件對(duì)象,但也可以是動(dòng)作對(duì)象。本例介紹對(duì)菜單欄和工具欄中控件對(duì)象建立信號(hào)與槽的連接。
信號(hào)的發(fā)送者是動(dòng)作對(duì)象時(shí),信號(hào)的接收者通常是頂層對(duì)象 “MainWindow”,而槽函數(shù)可以是對(duì)象 “MainWindow” 的內(nèi)置函數(shù),也可以是自定義函數(shù)。
在上一篇文章中我們?cè)鵀椴藛螜诤凸ぞ邫谥械膭?dòng)作 “actionQuit” 建立信號(hào)/槽連接,就是發(fā)送者是動(dòng)作對(duì)象、連接到對(duì)象 “MainWindow” 的內(nèi)置函數(shù)的案例。其操作過(guò)程如下:
- 從在 QtDesigner 右側(cè)下方窗口 “信號(hào)/槽編輯器”,點(diǎn)擊綠色的 “+” 新建一個(gè)信號(hào)/槽連接;
- 點(diǎn)擊 “<發(fā)送者>”,從菜單中選擇對(duì)象 “actionQuit”;
- 點(diǎn)擊 “<信號(hào)>”,從菜單中選擇 “triggered()”;
- 點(diǎn)擊 “<接收者>”,從菜單中選擇 “MainWindow”;
- 點(diǎn)擊 “<槽>”,從菜單中選擇 “closed()”。
以上操作的作用是:發(fā)送者 對(duì)象 “actionQuit” 觸發(fā) “triggered()” 時(shí),接收者 對(duì)象"MainWindow" 執(zhí)行槽函數(shù) “closed()”。
下面我們?cè)贋榱硪粋€(gè)動(dòng)作 “actionHelp” 建立信號(hào)/槽連接,連接的槽函數(shù)為自定義函數(shù) trigger_actHelp()。其操作過(guò)程如下:
- 在 QtDesigner 將自定義函數(shù) trigger_actHelp() 添加到槽函數(shù)配置連接表中;
- 從在 QtDesigner 右側(cè)下方窗口 “信號(hào)/槽編輯器”,點(diǎn)擊綠色的 “+” 新建一個(gè)信號(hào)/槽連接;
- 點(diǎn)擊 “<發(fā)送者>”,從菜單中選擇對(duì)象 “actionHelp”;
- 點(diǎn)擊 “<信號(hào)>”,從菜單中選擇 “triggered()”;
- 點(diǎn)擊 “<接收者>”,從菜單中選擇 “MainWindow”;
- 點(diǎn)擊 “<槽>”,從菜單中選擇 “trigger_actHelp()”。
至此,本章介紹了用 QtDesigner 進(jìn)行幾種常見(jiàn)的信號(hào)/槽連接的編輯和設(shè)置方法。如下圖所示,在 QtDesigner 中所添加的信號(hào)/槽連接都會(huì)在信號(hào)/槽編輯器窗口內(nèi)顯示。
3. 圖形界面的主程序
上節(jié)在 QtDesigner 中完成了圖形界面的設(shè)計(jì),將該文件另存為 uiDemo4.ui。打開(kāi) PyCharm,選中文件 uiDemo4.ui,使用 PyUIC 可以將其轉(zhuǎn)換為 uiDemo4.py。
接下來(lái)我們要編寫(xiě)圖形界面的主程序,調(diào)用圖形界面設(shè)計(jì)文件 uiDemo4.py。
3.1 從面向過(guò)程到面向?qū)ο?/h3>
面向過(guò)程的程序設(shè)計(jì)
在上一篇文章中,我們?cè)谥鞒绦蛑袆?chuàng)建主窗口后,直接調(diào)用 UI 中的 Ui_MainWindow()。這是面向過(guò)程的程序設(shè)計(jì)方法。
# GUIdemo3.py import uiDemo3 # 導(dǎo)入圖像界面設(shè)計(jì)文件 if __name__ == '__main__': app = QApplication(sys.argv) # 創(chuàng)建應(yīng)用程序?qū)ο? MainWindow = QMainWindow() # 創(chuàng)建主窗口 ui = uiDemo3.Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() # 顯示主窗口 sys.exit(app.exec_()) # 在主線程中退出
面向?qū)ο蟮某绦蛟O(shè)計(jì)
隨著項(xiàng)目的不斷深入,需要處理更加豐富的圖形界面和實(shí)現(xiàn)更加復(fù)雜的軟件功能,程序的規(guī)模越來(lái)越大,程序的結(jié)構(gòu)越來(lái)越復(fù)雜。
面向?qū)ο蟮某绦蛟O(shè)計(jì)使程序的結(jié)構(gòu)更加清晰,從而易于閱讀、理解、開(kāi)發(fā)和維護(hù),非常適合開(kāi)發(fā)大規(guī)模、多任務(wù)的圖形界面應(yīng)用軟件。PyQt5 中的類、對(duì)象、控件和方法,都是面向?qū)ο蟮某绦蛟O(shè)計(jì)的概念。因此,從本文開(kāi)始我們采用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,來(lái)編寫(xiě)圖形界面的主程序。
例程 GUIdemo4.py 如下:
from uiDemo4 import Ui_MainWindow # 導(dǎo)入 uiDemo4.py 中的 Ui_MainWindow 界面類 class MyMainWindow(QMainWindow, Ui_MainWindow): # 繼承 QMainWindow類和 Ui_MainWindow界面類 def __init__(self, parent=None): super(MyMainWindow, self).__init__(parent) # 初始化父類 self.setupUi(self) # 繼承 Ui_MainWindow 界面類 if __name__ == '__main__': app = QApplication(sys.argv) # 在 QApplication 方法中使用,創(chuàng)建應(yīng)用程序?qū)ο? myWin = MyMainWindow() # 實(shí)例化 MyMainWindow 類,創(chuàng)建主窗口 myWin.show() # 在桌面顯示控件 myWin sys.exit(app.exec_()) # 結(jié)束進(jìn)程,退出程序
在上面這個(gè)例程中,我們創(chuàng)建了一個(gè)類 MyMainWindow(),它繼承了 QtWidgets.QMainWindow 類方法和導(dǎo)入的 uiDemo4.py 中的 Ui_MainWindow 界面類。
super(MyMainWindow, self).init():初始化父類,把 MyMainWindow 的對(duì)象 self 轉(zhuǎn)成父類 QMainWindow 對(duì)象,并調(diào)用 init 函數(shù)。
self.setupUi(self):繼承 uiDemo4.py 中的 Ui_MainWindow 界面類,調(diào)用 Ui_MainWindow 類的setupUi() 方法。
不熟悉面向?qū)ο蟪绦蛟O(shè)計(jì)的小白,如果看不懂這段程序也沒(méi)有關(guān)系,保存下來(lái)照貓畫(huà)虎就可以了。
3.2 自定義槽函數(shù)
運(yùn)行例程 GUIdemo4.py。咦,報(bào)錯(cuò)了:
AttributeError: ‘MyMainWindow' object has no attribute ‘click_pushButton_2'
系統(tǒng)提示找不到 ‘click_pushButton_2',這是因?yàn)樵谥鞒绦蛑羞€沒(méi)有編寫(xiě) 2.2 中自定義的槽函數(shù)。
將自定義的槽函數(shù) click_pushButton_2()、click_pushButton_3、trigger_actHelp(self) 添加到主程序中。下面給出例程 GUIdemo4.py 完整的代碼。
# GUIdemo4.py # Demo4 of GUI by PyQt5 # Copyright 2021 youcans, XUPT # Crated:2021-10-10 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox from uiDemo4 import Ui_MainWindow # 導(dǎo)入 uiDemo4.py 中的 Ui_MainWindow 界面類 class MyMainWindow(QMainWindow, Ui_MainWindow): # 繼承 QMainWindow類和 Ui_MainWindow界面類 def __init__(self, parent=None): super(MyMainWindow, self).__init__(parent) # 初始化父類 self.setupUi(self) # 繼承 Ui_MainWindow 界面類 def click_pushButton_2(self): # 點(diǎn)擊 pushButton_2 觸發(fā) self.lineEdit_2.setText("click_pushButton_2") return def click_pushButton_3(self): # 點(diǎn)擊 pushButton_3 觸發(fā) from datetime import datetime # 導(dǎo)入 datetime 庫(kù) nowDate = datetime.now().strftime("%Y-%m-%d") # 獲取當(dāng)前日期 "2021-10-10" nowTime = datetime.now().strftime("%H:%M:%S") # 獲取當(dāng)前時(shí)間 "16:58:00" self.lineEdit_1.setText("Current date: {}".format(nowDate)) # 顯示日期 self.lineEdit_2.setText("Current time: {}".format(nowTime)) # 顯示時(shí)間 self.lineEdit_3.setText("Demo4 of GUI by PyQt5") # return def trigger_actHelp(self): # 動(dòng)作 actHelp 觸發(fā) QMessageBox.about(self, "About", """數(shù)字圖像處理工具箱 v1.0\nCopyright YouCans, XUPT 2021""") return if __name__ == '__main__': app = QApplication(sys.argv) # 在 QApplication 方法中使用,創(chuàng)建應(yīng)用程序?qū)ο? myWin = MyMainWindow() # 實(shí)例化 MyMainWindow 類,創(chuàng)建主窗口 myWin.show() # 在桌面顯示控件 myWin sys.exit(app.exec_()) # 結(jié)束進(jìn)程,退出程序
現(xiàn)在我們就得到了一個(gè)雖然簡(jiǎn)單但是很完整的面向?qū)ο蟮膱D形界面應(yīng)用程序 GUIdemo4。
檢查一下應(yīng)用程序 GUIdemo4 的各項(xiàng)功能:
- 點(diǎn)擊 “1# 按鈕”,清空 “文本編輯行-1”;
- 點(diǎn)擊 “2# 按鈕”,在 “文本編輯行-2” 顯示:“click_pushButton_2”;
- 點(diǎn)擊 “3# 按鈕”,在 “文本編輯行-1” 顯示當(dāng)前日期,在 “文本編輯行-2” 顯示當(dāng)前時(shí)間,在 “文本編輯行-3” 顯示: “Demo4 of GUI by PyQt5”;
- 點(diǎn)擊 “4# 按鈕”, “4# 按鈕” 的選項(xiàng)框被選中;
- 點(diǎn)擊工具欄中的 “幫助”,彈出上圖中的信息提示框,點(diǎn)擊 “OK” 可以關(guān)閉信息框;
- 點(diǎn)擊菜單欄或工具欄中的 “退出”,關(guān)閉圖形窗口應(yīng)用程序。
如果以上測(cè)試都成功了,那么恭喜小白同學(xué),你已經(jīng)掌握了用 QtDesigner 設(shè)計(jì) PyQt5 圖形界面的基本功能。
在下一篇文章中,我們將介紹 PyQt5 中的常用控件。
以上就是Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5信號(hào)與槽的連接的詳細(xì)內(nèi)容,更多關(guān)于PyQt5項(xiàng)目的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://blog.csdn.net/youcans/article/details/120664900