PyQt5中QPushButton的用法詳細(xì)解析與應(yīng)用實(shí)戰(zhàn)
引言
PyQt5 是一個(gè)用于創(chuàng)建圖形用戶界面的 Python 綁定庫,它基于 Qt5 應(yīng)用程序框架。在 PyQt5 中,QPushButton 是一個(gè)常用的控件,用于創(chuàng)建按鈕,允許用戶通過點(diǎn)擊來觸發(fā)某些操作。
用來給用戶點(diǎn)擊, 來完成某種動(dòng)作的控件,一般是矩形的
應(yīng)用場景
例如:登錄按鈕,注冊(cè)按鈕,關(guān)閉按鈕,一些選擇按鈕等等等
QPushButton繼承于QAbstractButton,所以具有AbstractButton的一切特性,而且QPushButton還包含自己特有的一些功能。
本文將詳細(xì)介紹 QPushButton 的用法,并通過實(shí)際案例來展示其強(qiáng)大的功能。
1. QPushButton 控件基礎(chǔ)
1.1 描述
QPushButton 控件是一個(gè)矩形按鈕,通常用于執(zhí)行如登錄、注冊(cè)、關(guān)閉等操作。用戶可以通過點(diǎn)擊按鈕來觸發(fā)一個(gè)事件或操作。
1.2 繼承關(guān)系
QPushButton 控件繼承自 QAbstractButton 類,這意味著它擁有 QAbstractButton 的所有功能,并增加了自己的特性。
1.3 初始化函數(shù)
QPushButton 的初始化函數(shù)可以接收多個(gè)參數(shù),具體取決于你想如何配置按鈕。最常見的用法包括:
QPushButton():創(chuàng)建一個(gè)無父控件和文本的按鈕。QPushButton(parent):創(chuàng)建控件的同時(shí),設(shè)置父控件。QPushButton(text, parent):創(chuàng)建控件的同時(shí),設(shè)置提示文本和父控件。QPushButton(icon, text, parent):創(chuàng)建控件的同時(shí),設(shè)置圖標(biāo)、提示文本和父控件。
2. QPushButton 的常用功能
2.1 創(chuàng)建按鈕

按鈕可以顯示文本和圖標(biāo)。使用 setText() 方法設(shè)置文本,使用 setIcon() 和 setIconSize() 方法設(shè)置圖標(biāo)及其大小。
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtGui import QIcon
app = QApplication([])
window = QWidget()
window.setWindowTitle('QPushButton 示例')
btn = QPushButton(window)
btn.setText('點(diǎn)擊我')
icon = QIcon('icon.png')
btn.setIcon(icon)
btn.setIconSize(QSize(30, 30)) # 假設(shè)需要導(dǎo)入QSize
btn.show()
window.show()
app.exec_()
代碼展示:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("QPushButton創(chuàng)建")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
#創(chuàng)建按鈕
#創(chuàng)建方式一,指定活不指定父控件
btn = QPushButton(window)
btn.setText("按鈕1")
#創(chuàng)建方式二,創(chuàng)建按鈕的同時(shí),設(shè)置提示文本和父控件
btn2 = QPushButton('按鈕2',window)
btn2.move(50,50)
#創(chuàng)建方式三,創(chuàng)建控件的同時(shí), 設(shè)置圖標(biāo), 提示文本和父控件
btn3 = QPushButton(QIcon("../../imgs/python-gui.png"),'按鈕3',window)
btn3.move(100,100)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())
運(yùn)行可見,三種創(chuàng)建方式都可以

2.2 啟用和禁用
可以使用 setEnabled() 方法啟用或禁用按鈕。禁用的按鈕不會(huì)響應(yīng)用戶的點(diǎn)擊操作。
btn.setEnabled(False) # 禁用按鈕
2.3 設(shè)置快捷鍵
QPushButton 支持設(shè)置快捷鍵,允許用戶通過鍵盤操作來觸發(fā)按鈕的點(diǎn)擊事件。使用 setShortcut() 方法設(shè)置快捷鍵。
btn.setShortcut('Ctrl+Q') # 設(shè)置快捷鍵為 Ctrl+Q
這個(gè)與其父類QAbdtractButton用法一樣,略

2.4 菜單設(shè)置
當(dāng)我們鼠標(biāo),點(diǎn)擊按鈕之后,可以展開一系列的下拉菜單供我們選擇
當(dāng)我們創(chuàng)建菜單之后,用戶點(diǎn)擊按鈕,就會(huì)展示相關(guān)菜單
API介紹

showMenu()指的是我們程序員可以通過代碼來控制按鈕來展示菜單
當(dāng)我們把鼠標(biāo)放在某菜單上面,會(huì)顯示出第二列,甚至第三列的菜單稱為子菜單

QMenu相關(guān)操作

代碼展示:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("菜單創(chuàng)建")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
#創(chuàng)建按鈕
btn = QPushButton(window)
btn.setText("按鈕1")
#創(chuàng)建菜單
menu = QMenu(window)
#將菜單放到按鈕上,此時(shí)按鈕就會(huì)出現(xiàn)一個(gè)下拉箭頭
btn.setMenu(menu)
# 子菜單 最近打開
# open_recent_menu = QMenu(menu)
#設(shè)置子菜單標(biāo)題
# open_recent_menu.setTitle("最近打開")
#一次性寫全,創(chuàng)建子菜單
#QMenu(title: Optional[str], parent: Optional[QWidget] = None)
open_recent_menu = QMenu("最近打開",menu)
# 行為動(dòng)作 新建 打開 分割線 退出
# new_action = QAction()
# new_action.setText("新建")
# new_action.setIcon(QIcon("../../imgs/python-gui.png"))
#新建,一次性寫全創(chuàng)建動(dòng)作
#QAction(icon: QIcon, text: Optional[str], parent: Optional[QObject] = None)
new_action = QAction(QIcon("../../imgs/python-gui.png"), "新建", menu)
#通過信號(hào)來執(zhí)行相應(yīng)的槽函數(shù)
new_action.triggered.connect(lambda: print("新建文件"))
#打開
open_action = QAction(QIcon("xxx.png"), "打開", menu)
open_action.triggered.connect(lambda: print("打開文件"))
#退出程序
exit_action = QAction("退出", menu)
# exit_action.triggered.connect(lambda: print("退出程序"))
exit_action.triggered.connect(lambda: window.close())
#子菜單動(dòng)作
file_action = QAction("Python-GUI編程-PyQt5")
file_action.triggered.connect(lambda :print("Python-GUI編程-PyQt5"))
#將動(dòng)作添加到菜單上,點(diǎn)擊菜單執(zhí)行相應(yīng)動(dòng)作
menu.addAction(new_action)
menu.addAction(open_action)
#子菜單添加動(dòng)作
open_recent_menu.addAction(file_action)
#添加子菜單
menu.addMenu(open_recent_menu)
#添加分割線
menu.addSeparator()
menu.addAction(exit_action)
# 2.3 展示控件
window.show()
#展示菜單,相當(dāng)于用戶點(diǎn)擊了按鈕的菜單按鈕
#展示菜單的代碼一定要在主窗口展示之后,否則展示不到
# btn.showMenu()
#獲取菜單
print(btn.menu())
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())
點(diǎn)擊下拉菜單

點(diǎn)擊新建,會(huì)觸發(fā)信號(hào)

2.4 邊框是否扁平
QPushButton 支持設(shè)置邊框是否扁平。扁平化的按鈕在某些樣式下可能不繪制背景,只顯示文本或圖標(biāo)。使用 setFlat() 方法設(shè)置此屬性。
設(shè)置了按鈕扁平化之后,給按鈕設(shè)置的背景顏色等樣式,都不在生效

代碼展示:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("按鈕扁平化")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
#創(chuàng)建按鈕,默認(rèn)按鈕是凸出來的
btn = QPushButton(window)
btn.setText("按鈕")
#查看默認(rèn)情況下,按鈕是否扁平化
# print(btn.isFlat()) #False
#給按鈕設(shè)置背景顏色
btn.setStyleSheet("background-color: red;")
#設(shè)置按鈕扁平化
btn.setFlat(True)
#再次查看按鈕是否扁平化
print(btn.isFlat()) #True
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())
設(shè)置扁平化之前,按鈕有凸起

設(shè)置扁平化
btn.setFlat(True)
按鈕不再有凸起,而是與周邊樣式一樣

當(dāng)點(diǎn)下按鈕,才能看到按鈕樣式

而且設(shè)置扁平化之后,給按鈕設(shè)置的背景顏色等樣式也不再生效
未設(shè)置扁平化之前,按鈕背景顏色設(shè)為了紅色,且顯示紅色

設(shè)置扁平化之后,按鈕背景顏色不再顯示

只有點(diǎn)下時(shí),才顯示

2.5 信號(hào)和槽
QPushButton 的主要事件是 clicked,即按鈕被點(diǎn)擊時(shí)觸發(fā)??梢酝ㄟ^ clicked.connect() 方法將 clicked 信號(hào)連接到自定義的槽函數(shù)。
def on_click():
print('按鈕被點(diǎn)擊了')
btn.clicked.connect(on_click)
2.6 默認(rèn)按鈕處理
主要應(yīng)用場景在 彈出對(duì)話框時(shí),默認(rèn)光標(biāo)所在的按鈕
例如如下所示,當(dāng)我們點(diǎn)擊打開文件按鈕,會(huì)彈出一個(gè)對(duì)話框,此時(shí)鼠標(biāo)光標(biāo)會(huì)默認(rèn)落在 打開 這個(gè)按鈕上

默認(rèn)按鈕處理有自動(dòng)默認(rèn)處理和設(shè)置默認(rèn)
自動(dòng)默認(rèn)按鈕,指的是當(dāng)用戶點(diǎn)擊該按鈕,該按鈕就自動(dòng)的會(huì)被選中為默認(rèn)的
setDefault()是直接設(shè)置該按鈕為默認(rèn)按鈕

默認(rèn)情況下,我們點(diǎn)擊按鈕,松開后會(huì)恢復(fù)原樣
代碼展示:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("默認(rèn)按鈕")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
btn = QPushButton(window)
btn.setText("按鈕1")
btn2 = QPushButton(window)
btn2.setText("btn2")
btn2.move(100, 100)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

當(dāng)我們?cè)O(shè)置為自動(dòng)默認(rèn)按鈕后,用戶再點(diǎn)擊該按鈕,即便釋放后,該按鈕也會(huì)處于被選中狀態(tài)
btn2.setAutoDefault(True) #查看按鈕是否設(shè)置了自動(dòng)默認(rèn)按鈕 print(btn.autoDefault()) print(btn2.autoDefault())
當(dāng)我們點(diǎn)擊btn2,btn2就會(huì)處于被選中狀態(tài)
由下列的打印也可得知,btn2設(shè)置了自動(dòng)默認(rèn)按鈕

setAutoDefault() 是用戶點(diǎn)擊了,才設(shè)置為自動(dòng)默認(rèn)
如果想要一開始就是默認(rèn)按鈕,則使用setDefault()
#設(shè)置默認(rèn)按鈕 btn2.setDefault(True) #查看是夠設(shè)置了默認(rèn)按鈕 print(btn.isDefault()) print(btn2.isDefault())
此時(shí),運(yùn)行程序,btn2就設(shè)置了默認(rèn)按鈕,處于被選中狀態(tài)

2.7 右鍵菜單
用戶用鼠標(biāo)右鍵點(diǎn)擊窗口后,彈出來的菜單
右鍵菜單實(shí)際上是通過發(fā)射信號(hào)來實(shí)現(xiàn)的
QPushbutton的信號(hào)都是繼承自父類的
右鍵菜單實(shí)現(xiàn)的方式有兩種

方法一
也是默認(rèn)的,window.setContextMenuPolicy(Qt.DefaultContextMenu)
當(dāng)我們?cè)赑yQT5組件上右鍵點(diǎn)擊窗體時(shí)會(huì)觸發(fā)一個(gè)事件:contextMenuEvent,
默認(rèn)情況下,window.setContextMenuPolicy()里面的是參數(shù)是Qt.DefaultContextMenu,鼠標(biāo)右鍵執(zhí)行的是contextMenuEvent
我們要想自己設(shè)計(jì)右鍵點(diǎn)擊后彈出的事件,我們就必須要重載contextMenuEvent這個(gè)方法。
代碼展示:
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
#重寫個(gè)窗口類,繼承QWidget,重寫contextMenuEvent方法
class Window(QWidget):
# 重寫contextMenuEvent方法,然后在該窗口下只要鼠標(biāo)右鍵,就會(huì)觸發(fā)該方法,執(zhí)行該方法中的邏輯
def contextMenuEvent(self, evt):
print("在窗口中右鍵點(diǎn)擊鼠標(biāo)")
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("右鍵菜單")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())
鼠標(biāo)右鍵

右擊展示菜單代碼
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
#重寫個(gè)窗口類,繼承QWidget,重寫contextMenuEvent方法
class Window(QWidget):
# 重寫contextMenuEvent方法,然后在該窗口下只要鼠標(biāo)右鍵,就會(huì)觸發(fā)該方法,執(zhí)行該方法中的邏輯
# QContextMenuEvent
def contextMenuEvent(self, evt):
# print("在窗口中右鍵點(diǎn)擊鼠標(biāo)")
# 創(chuàng)建菜單
menu = QMenu(window)
# 子菜單 最近打開
# open_recent_menu = QMenu(menu)
# 設(shè)置子菜單標(biāo)題
# open_recent_menu.setTitle("最近打開")
# 一次性寫全,創(chuàng)建子菜單
# QMenu(title: Optional[str], parent: Optional[QWidget] = None)
open_recent_menu = QMenu("最近打開", menu)
# 行為動(dòng)作 新建 打開 分割線 退出
# new_action = QAction()
# new_action.setText("新建")
# new_action.setIcon(QIcon("../../imgs/python-gui.png"))
# 新建,一次性寫全創(chuàng)建動(dòng)作
# QAction(icon: QIcon, text: Optional[str], parent: Optional[QObject] = None)
new_action = QAction(QIcon("../../imgs/python-gui.png"), "新建", menu)
# 通過信號(hào)來執(zhí)行相應(yīng)的槽函數(shù)
new_action.triggered.connect(lambda: print("新建文件"))
# 打開
open_action = QAction(QIcon("xxx.png"), "打開", menu)
open_action.triggered.connect(lambda: print("打開文件"))
# 退出程序
exit_action = QAction("退出", menu)
# exit_action.triggered.connect(lambda: print("退出程序"))
exit_action.triggered.connect(lambda: window.close())
# 子菜單動(dòng)作
file_action = QAction("Python-GUI編程-PyQt5")
file_action.triggered.connect(lambda: print("Python-GUI編程-PyQt5"))
# 將動(dòng)作添加到菜單上,點(diǎn)擊菜單執(zhí)行相應(yīng)動(dòng)作
menu.addAction(new_action)
menu.addAction(open_action)
# 子菜單添加動(dòng)作
open_recent_menu.addAction(file_action)
# 添加子菜單
menu.addMenu(open_recent_menu)
# 添加分割線
menu.addSeparator()
menu.addAction(exit_action)
#展示菜單用exec_()方法,執(zhí)行的時(shí)候傳遞QPoint對(duì)象,是哪個(gè)點(diǎn)的位置
#默認(rèn)菜單會(huì)在(0,0)位置展示
# 我們?cè)O(shè)置在鼠標(biāo)點(diǎn)擊的位置顯示菜單,evt.globalPos()獲取鼠標(biāo)右擊點(diǎn)的位置
#必須是相對(duì)于全局的坐標(biāo),不能是相對(duì)于窗口的坐標(biāo)
menu.exec_(evt.globalPos())
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("右鍵菜單")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

方法二
window.setContextMenuPolicy(Qt.CustomContextMenu)
需要自定義個(gè)槽函數(shù),根據(jù)信號(hào)觸發(fā)
代碼展示
# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import * # 主要包含了我們常用的一些類, 匯總到了一塊
import sys
# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)
# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()
# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("右鍵菜單方式二")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)
#自定義個(gè)方法,來創(chuàng)建菜單,形參接收一個(gè)相對(duì)于窗口的位置坐標(biāo)QPoint對(duì)象
def show_menu(point):
print(point)
# 創(chuàng)建菜單
menu = QMenu(window)
# 子菜單 最近打開
# open_recent_menu = QMenu(menu)
# 設(shè)置子菜單標(biāo)題
# open_recent_menu.setTitle("最近打開")
# 一次性寫全,創(chuàng)建子菜單
# QMenu(title: Optional[str], parent: Optional[QWidget] = None)
open_recent_menu = QMenu("最近打開", menu)
# 行為動(dòng)作 新建 打開 分割線 退出
# new_action = QAction()
# new_action.setText("新建")
# new_action.setIcon(QIcon("../../imgs/python-gui.png"))
# 新建,一次性寫全創(chuàng)建動(dòng)作
# QAction(icon: QIcon, text: Optional[str], parent: Optional[QObject] = None)
new_action = QAction(QIcon("../../imgs/python-gui.png"), "新建", menu)
# 通過信號(hào)來執(zhí)行相應(yīng)的槽函數(shù)
new_action.triggered.connect(lambda: print("新建文件"))
# 打開
open_action = QAction(QIcon("xxx.png"), "打開", menu)
open_action.triggered.connect(lambda: print("打開文件"))
# 退出程序
exit_action = QAction("退出", menu)
# exit_action.triggered.connect(lambda: print("退出程序"))
exit_action.triggered.connect(lambda: window.close())
# 子菜單動(dòng)作
file_action = QAction("Python-GUI編程-PyQt5")
file_action.triggered.connect(lambda: print("Python-GUI編程-PyQt5"))
# 將動(dòng)作添加到菜單上,點(diǎn)擊菜單執(zhí)行相應(yīng)動(dòng)作
menu.addAction(new_action)
menu.addAction(open_action)
# 子菜單添加動(dòng)作
open_recent_menu.addAction(file_action)
# 添加子菜單
menu.addMenu(open_recent_menu)
# 添加分割線
menu.addSeparator()
menu.addAction(exit_action)
# 展示菜單用exec_()方法
# 默認(rèn)菜單會(huì)在(0,0)位置展示
#方法中的參數(shù)point可以獲取鼠標(biāo)右鍵點(diǎn)擊相對(duì)于窗口的局部坐標(biāo)
#window.mapToGlobal將point局部坐標(biāo)轉(zhuǎn)換為全局坐標(biāo)點(diǎn)
# 將point局部坐標(biāo)點(diǎn),映射為相對(duì)于桌面的全局坐標(biāo)點(diǎn)坐標(biāo)
dest_point = window.mapToGlobal(point)
menu.exec_(dest_point)
#自定義右鍵菜單,通過發(fā)射信號(hào)方式來觸發(fā),先將菜單上下文策略設(shè)為自定義模式
window.setContextMenuPolicy(Qt.CustomContextMenu)
#根據(jù)定義的槽函數(shù)發(fā)射信號(hào)
window.customContextMenuRequested.connect(show_menu)
# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())
鼠標(biāo)在窗口上右鍵,彈出菜單

當(dāng)然,我們可以繼續(xù)深入討論 PyQt5 中 QPushButton 的高級(jí)用法以及如何在更復(fù)雜的應(yīng)用場景中使用它。以下是一些擴(kuò)展話題和示例:
3. 按鈕樣式定制
PyQt5 允許你通過樣式表(QSS,類似于 CSS)來自定義按鈕的外觀。這包括改變按鈕的背景色、邊框、字體等。
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
app = QApplication([])
window = QWidget()
btn = QPushButton('定制樣式', window)
btn.setStyleSheet("""
QPushButton {
background-color: #4CAF50;
color: white;
border: 2px solid #3e8e41;
border-radius: 10px;
padding: 10px;
font-size: 16px;
min-width: 100px;
}
QPushButton:hover {
background-color: #45a049;
}
QPushButton:pressed {
background-color: #388e3c;
}
""")
btn.show()
window.show()
app.exec_()
在這個(gè)例子中,我們?yōu)榘粹o設(shè)置了基本的樣式,包括背景色、文字顏色、邊框、邊框圓角、內(nèi)邊距、字體大小和最小寬度。同時(shí),我們還定義了鼠標(biāo)懸停和按鈕按下時(shí)的樣式變化。
4. 按鈕的動(dòng)畫效果
雖然 PyQt5 本身不直接支持復(fù)雜的動(dòng)畫效果,但你可以使用 QPropertyAnimation 來為按鈕添加簡單的動(dòng)畫,如淡入淡出、大小變化等。
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QPropertyAnimation, QRect, QPoint
app = QApplication([])
window = QWidget()
btn = QPushButton('動(dòng)畫效果', window)
btn.setGeometry(50, 50, 100, 40)
# 創(chuàng)建一個(gè)動(dòng)畫對(duì)象,用于改變按鈕的幾何形狀
animation = QPropertyAnimation(btn, b"geometry")
animation.setDuration(1000) # 持續(xù)時(shí)間1000毫秒
animation.setStartValue(QRect(50, 50, 100, 40))
animation.setEndValue(QRect(150, 50, 100, 40)) # 移動(dòng)到新的位置
animation.start() # 開始動(dòng)畫
btn.show()
window.show()
app.exec_()
在這個(gè)例子中,我們創(chuàng)建了一個(gè)動(dòng)畫,使按鈕在屏幕上水平移動(dòng)。注意,這里使用了 QPropertyAnimation 的 b"geometry" 屬性來指定要改變的屬性。
5. 按鈕的分組和禁用
在某些情況下,你可能需要將多個(gè)按鈕組合在一起,并允許用戶一次只能激活其中一個(gè)。雖然 PyQt5 沒有直接提供按鈕組的控件,但你可以通過編程方式實(shí)現(xiàn)這一功能。
此外,如果你需要禁用一組按鈕中的某些按鈕,可以遍歷這些按鈕并調(diào)用它們的 setEnabled(False) 方法。
6. 按鈕的自定義行為
除了基本的點(diǎn)擊事件外,你還可以為按鈕添加其他類型的事件處理邏輯,如雙擊事件、長按事件等。雖然 PyQt5 的 QPushButton 不直接支持雙擊和長按事件,但你可以通過重寫按鈕的某些方法或使用定時(shí)器來模擬這些行為。
7. 實(shí)際應(yīng)用中的按鈕設(shè)計(jì)
在開發(fā)實(shí)際應(yīng)用程序時(shí),按鈕的設(shè)計(jì)應(yīng)該符合應(yīng)用程序的整體風(fēng)格和用戶體驗(yàn)。這包括按鈕的大小、顏色、位置、文本內(nèi)容以及圖標(biāo)的選擇。同時(shí),按鈕的響應(yīng)速度和反饋也是非常重要的,用戶應(yīng)該能夠清楚地知道他們的操作是否被系統(tǒng)識(shí)別和處理。
總結(jié)
QPushButton 是 PyQt5 中一個(gè)非常強(qiáng)大且靈活的控件,它允許你創(chuàng)建各種類型的按鈕來滿足不同的需求。通過本文的介紹,你應(yīng)該已經(jīng)掌握了 QPushButton 的基本用法和高級(jí)功能,并能夠在實(shí)際應(yīng)用中靈活運(yùn)用它。隨著你對(duì) PyQt5 的進(jìn)一步學(xué)習(xí),你會(huì)發(fā)現(xiàn)更多關(guān)于按鈕和其他控件的有趣用法和技巧。
以上就是PyQt5中QPushButton的用法詳細(xì)解析與應(yīng)用實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于PyQt5 QPushButton用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python使用wxpy實(shí)現(xiàn)微信消息防撤回腳本
這篇文章主要為大家詳細(xì)介紹了python使用wxpy實(shí)現(xiàn)微信消息防撤回腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
使用python制作一個(gè)為hex文件增加版本號(hào)的腳本實(shí)例
今天小編就為大家分享一篇使用python制作一個(gè)為hex文件增加版本號(hào)的腳本實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python基于opencv調(diào)用攝像頭獲取個(gè)人圖片的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Python基于opencv調(diào)用攝像頭獲取個(gè)人圖片的實(shí)現(xiàn)方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
python基礎(chǔ)知識(shí)之try...except...的詳細(xì)用法實(shí)例
在各種編程語言進(jìn)行工作和學(xué)習(xí)的過程中,都會(huì)有一些錯(cuò)誤異常,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)知識(shí)之try...except...的詳細(xì)用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

