python PyQt5的窗口界面的各種交互邏輯實現(xiàn)
PyQt5窗口交互
在PyQt5中,可以使用信號和槽來處理控件的交互狀態(tài)。
常見API如下所示

1. 控件狀態(tài)
控件狀態(tài)表明了這個控件是否是可用的,比如一個按鈕,通常使用灰色來表示為不可點擊。在pyQt中,可以通過setEnabled()函數(shù)來設(shè)置控件的使能狀態(tài),以下代碼繪制了一個無法被點擊的按鈕:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標題,默認標題是python,只有頂級控件才可以設(shè)置標題欄的標題
window.setWindowTitle("窗口是否可用")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標題欄
window.resize(500, 500)
#創(chuàng)建個子控件
btn = QPushButton(window)
btn.setText("按鈕")
btn.move(100,100)
#設(shè)置信號與槽
btn.pressed.connect(lambda :print("按鈕被點擊了"))
#查看按鈕是否可用
print(btn.isEnabled())
#設(shè)置按鈕不可用
btn.setEnabled(False)
#查看按鈕是否可用
print("設(shè)置后",btn.isEnabled())
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進入到消息循環(huán)
sys.exit(app.exec_())
運行,可見設(shè)置按鈕不可用之前,按鈕狀態(tài)是可用的。設(shè)置之后,按鈕是灰色的,不可點擊

2. 控件可視化

只有窗口被繪制,才會被顯示出來
可以通過setVisible()來設(shè)置一個控件是否可視,以下代碼創(chuàng)建一個按鍵,但是設(shè)置為不可視:
setVisible()傳遞的參數(shù)值為True也不一定可見,主要還要看父控件的可見性
setHidden(bool) show() hide() 本質(zhì)上還是調(diào)用了setVisible()方法
如下代碼展示了,當調(diào)用了窗口對象show方法,就會觸發(fā)繪制事件
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
class Window(QWidget):
#窗口繪制時,觸發(fā)該事件
def paintEvent(self, evt):
print("窗口被繪制了")
#重寫了父類方法,由于我們不做繪制邏輯,讓父類方法繪制,所以將父類繪制方法返回
return super().paintEvent(evt)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()
# 2.2 設(shè)置控件
#設(shè)置窗口標題,默認標題是python,只有頂級控件才可以設(shè)置標題欄的標題
window.setWindowTitle("控件可視化")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標題欄
window.resize(500, 500)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進入到消息循環(huán)
sys.exit(app.exec_())
運行

當我們將show方法注釋,繪制事件就不會被觸發(fā)

此時,我們使用setVisible()方法,依然會觸發(fā)繪制事件
#設(shè)置窗口可見 window.setVisible(True)

使用setHidden()方法設(shè)置窗口可見性
window.setHidden(False)

窗口繪制的時候,先繪制主窗口,再繪制子控件
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
class Window(QWidget):
#窗口繪制時,觸發(fā)該事件
def paintEvent(self, evt):
print("窗口被繪制了")
#重寫了父類方法,由于我們不做繪制邏輯,讓父類方法繪制,所以將父類繪制方法返回
return super().paintEvent(evt)
class Btn(QPushButton):
def paintEvent(self, evt):
print("按鈕被繪制了")
#重寫了父類方法,由于我們不做繪制邏輯,讓父類方法繪制,所以將父類繪制方法返回
return super().paintEvent(evt)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()
# 2.2 設(shè)置控件
#設(shè)置窗口標題,默認標題是python,只有頂級控件才可以設(shè)置標題欄的標題
window.setWindowTitle("控件可視化")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標題欄
window.resize(500, 500)
#創(chuàng)建按鈕
btn = Btn(window)
btn.setText("按鈕")
# 2.3 展示控件
# window.show()
#設(shè)置窗口可見
# window.setVisible(True)
window.setHidden(False)
# 3. 應(yīng)用程序的執(zhí)行, 進入到消息循環(huán)
sys.exit(app.exec_())
運行可以看到,先繪主窗口,再繪制子控件 按鈕

我們也可以設(shè)置當我們點擊按鈕時,隱藏按鈕
btn.pressed.connect(lambda :btn.hide())

控制控件的顯示和隱藏的本質(zhì)是控制該控件是否被繪制
判定控件是否隱藏

isHidden() 判斷控件是否設(shè)置了隱藏,如果沒有設(shè)置隱藏,即使父控件不可見,該值獲得的結(jié)果依然是 沒有隱藏

isVisibleTo(widget)
如果能隨著widget控件的顯示和隱藏, 而同步變化, 則返回True

3.控件是否被編輯

代碼展示:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標題,默認標題是python,只有頂級控件才可以設(shè)置標題欄的標題
window.setWindowTitle("編輯窗口[*]")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標題欄
window.resize(500, 500)
#設(shè)置窗口是被編輯狀態(tài)
window.setWindowModified(True)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進入到消息循環(huán)
sys.exit(app.exec_())
設(shè)置被編輯狀態(tài),標題欄顯示個星星

當沒有設(shè)置為編輯狀態(tài),不顯示星星

判斷窗口是否處于被編輯狀態(tài)
#獲取窗口是否處于被編輯狀態(tài) print(window.isWindowModified())

4.控件的關(guān)閉
具體API
window.close() #這種起始只是隱藏了按鈕
setAttribute(Qt.WA_DeleteOnClose, True) #當設(shè)置了這個屬性,設(shè)置按鈕關(guān)閉時,就會釋放按鈕
只是關(guān)閉按鈕,并不會觸發(fā)destroyed事件

#設(shè)置屬性 btn.setAttribute(Qt.WA_DeleteOnClose, True)
此時,關(guān)閉按鈕,就會釋放

5.控件交互綜合案例
創(chuàng)建一個窗口, 包含一個文本框和一個按鈕和一個標簽
默認狀態(tài)
標簽隱藏
文本框和按鈕顯示
按鈕設(shè)置為不可用狀態(tài)
當文本框有內(nèi)容時, 讓按鈕可用, 否則不可用
當文本框內(nèi)容為jingtian時, 點擊按鈕則顯示標簽, 并展示文本為登錄成功;否則為失敗
代碼展示
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("交互狀態(tài)案例的學(xué)習(xí)")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
# 添加三個子控件
label = QLabel(self)
label.setText("標簽")
label.move(100, 50)
#默認讓標簽隱藏
label.hide()
#輸入文本框
le = QLineEdit(self)
# le.setText("文本框")
le.move(100, 100)
btn = QPushButton(self)
btn.setText("登錄")
btn.move(100, 150)
btn.setEnabled(False)
#參數(shù)值就是輸入的內(nèi)容
def text_cao(text):
print("文本內(nèi)容發(fā)生了改變", text)
# if len(text) > 0:
# btn.setEnabled(True)
# else:
# btn.setEnabled(False)
btn.setEnabled(len(text) > 0)
#文件改變事件
le.textChanged.connect(text_cao)
def check():
# print("按鈕被點擊了")
# 1. 獲取文本框內(nèi)容
content = le.text()
# 2. 判定是否是jingtian
if content == "jingtian":
# 3. 是 -> 顯示之前隱藏的提示標簽, 展示文本
label.setText("登錄成功")
else:
label.setText("登錄失敗")
#顯示標簽內(nèi)容
label.show()
#設(shè)置標簽尺寸自適應(yīng)
label.adjustSize()
#點擊登錄按鈕時觸發(fā)
btn.pressed.connect(check)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
運行,當沒有輸入時,按鈕是不可用狀態(tài)

輸入jigntian,點擊登錄,顯示登錄成功

輸入其他內(nèi)容,點擊登錄,顯示登錄失敗

6.控件信息提示
一些控件當我們光標停留在上面的時候,會顯示一個小框文本來提示。
提示大致分為三種,具體如下圖所示

代碼展示
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *
import sys
# 1. 創(chuàng)建一個應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
# window = QWidget()
#創(chuàng)建主窗口,里面的子控件懶加載
window = QMainWindow()
# 懶加載
# 用到的時候, 才會創(chuàng)建
window.statusBar() #設(shè)置狀態(tài)欄
# 2.2 設(shè)置控件
window.setWindowTitle("信息提示")
window.resize(500, 500)
#把窗口模式改成帶問號的,窗口上下文幫助按鈕
window.setWindowFlags(Qt.WindowContextHelpButtonHint)
# 當鼠標停留在窗口控件身上之后, 在狀態(tài)欄提示的一段文本
window.setStatusTip("這是窗口")
#獲取狀態(tài)欄提示
print(window.statusTip())
label = QLabel(window)
label.setText("社會我景天哥")
#鼠標放在標簽上時,觸發(fā)狀態(tài)欄顯示相關(guān)內(nèi)容
label.setStatusTip("這是標簽")
#設(shè)置工具欄提示,鼠標放到標簽上時,直接在旁邊提示
label.setToolTip("這是一個提示標簽")
#獲取工具欄提示
print(label.toolTip())
#設(shè)置工具欄提示時長
label.setToolTipDuration(2000)
print(label.toolTipDuration())
#鼠標變成一個問號時,點擊鼠標顯示設(shè)置內(nèi)容
label.setWhatsThis("這是啥? 這是標簽")
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進入到消息循環(huán)
sys.exit(app.exec_())
當鼠標放在窗口上,狀態(tài)欄顯示

當鼠標放在標簽上,狀態(tài)欄和工具欄顯示

當設(shè)置窗口模式,讓鼠標變成問號,點擊標簽時顯示

7.窗口焦點控制
當窗口中有多個控件時,鼠標焦點可能會聚焦到不同控件
焦點我們可以用鼠標點擊,也可以按tab鍵切換
焦點在哪里,鍵盤輸入就輸入到哪里
只有獲取焦點的控件,才能與用戶交互

代碼展示
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *
import sys
#繼承,重寫鼠標監(jiān)聽
class Window(QWidget):
def mousePressEvent(self, evt):
print("動態(tài)監(jiān)聽打印獲取焦點的空間",self.focusWidget())
#點擊鼠標,焦點聚焦到下一個子控件
# self.focusNextChild()
#點擊鼠標,焦點聚焦到上一個子控件
# self.focusPreviousChild()
#點擊鼠標,焦點聚焦到下一個子控件 True是聚焦到下一個子控件,F(xiàn)alse是聚焦到上一個子控件
# self.focusNextPrevChild(True)
# 1. 創(chuàng)建一個應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()
# 2.2 設(shè)置控件
window.setWindowTitle("焦點控制")
window.resize(500, 500)
le1 = QLineEdit(window)
le1.move(50, 50)
le2 = QLineEdit(window)
le2.move(100, 100)
le3 = QLineEdit(window)
le3.move(150, 150)
#設(shè)置子控件,按下tab鍵獲取焦點的順序
#setTabOrder是靜態(tài)方法,直接用類來調(diào)用
Window.setTabOrder(le1, le3)
Window.setTabOrder(le3, le2)
#人為設(shè)置初始的焦點位置
# le2.setFocus()
#設(shè)置獲取焦點的方式
# le2.setFocusPolicy(Qt.TabFocus) #通過tab獲取焦點
# le2.setFocusPolicy(Qt.ClickFocus) #通過鼠標點擊獲取焦點
# le2.setFocusPolicy(Qt.StrongFocus) #可以通過鼠標和tab鍵獲取焦點,默認是這種方式
# le2.setFocusPolicy(Qt.NoFocus) #不能通過鼠標和tab鍵獲取焦點,但可以通過setFocus仍可使其獲得焦點
# le2.setFocus()
#取消焦點,這個一般配合setFocus()使用
# le2.clearFocus()
# 2.3 展示控件
window.show()
# print(le1)
# print(le2)
# print(le3)
#
# le2.setFocus()
# 獲取當前窗口內(nèi)部, 所有子控件當中獲取焦點的那個控件
#要獲取到,必須通過設(shè)置哪個控件獲取焦點,才能獲取到,如果沒有設(shè)置,獲取到的是None
print("獲取當前光標聚焦的子控件",window.focusWidget())
# le1.clearFocus()
# 3. 應(yīng)用程序的執(zhí)行, 進入到消息循環(huán)
sys.exit(app.exec_())
按tab切換光標焦點

當然,根據(jù)設(shè)置,點擊鼠標也可以切換光標
以上就是python中PyQt5窗口界面的各種交互邏輯實現(xiàn)的詳細內(nèi)容,更多關(guān)于python PyQt5窗口交互的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python設(shè)計模式編程中解釋器模式的簡單程序示例分享
這篇文章主要介紹了Python設(shè)計模式編程中解釋器模式的簡單程序示例分享,解釋器模式強調(diào)用抽象類來表達程序中將要實現(xiàn)的功能,需要的朋友可以參考下2016-03-03
python區(qū)分不同數(shù)據(jù)類型的方法
這篇文章主要介紹了python區(qū)分不同數(shù)據(jù)類型的方法實例以及相關(guān)知識點,需要的朋友們學(xué)習(xí)下。2019-10-10
基于SQLAlchemy實現(xiàn)操作MySQL并執(zhí)行原生sql語句
這篇文章主要介紹了基于SQLAlchemy實現(xiàn)操作MySQL并執(zhí)行原生sql語句,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06

