按照繼承關系來學習
1、按鈕控件
1.1 QAbstractButton
1.1.1 簡介
1.1.1.1 描述
- 所有按鈕控件的基類
- 提供按鈕的通用功能
- 其繼承自 QWidget
- 其為 C++ 中的虛繼承類,無法實例化對象,只有子類化,才能實例化對象
1.1.1.2 自定義按鈕
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
class Btn(QAbstractButton):
# 子類化,使得可以實例化對象,同時要重寫paintEvent函數
def paintEvent(self, evt):
# 這個可以自定義一個按鈕
# print("繪制按鈕")
# 創建一個畫家,self 是紙張
painter = QPainter(self)
# 實例化一支筆
pen = QPen(QColor(0, 0, 0), 6) # 顏色,和畫筆大小
# 給畫家一支筆
painter.setPen(pen)
# 畫畫
painter.drawText(20, 20, self.text()) # 將字寫在按鈕上面
painter.drawEllipse(0, 0, 100, 100) # 畫一個橢圓
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = Btn(w)
btn.setText("QAbstractButton")
btn.pressed.connect(lambda: print("自定義按鈕被按下了"))
w.setVisible(True) # 設置為可見
sys.exit(app.exec_())
1.1.2 提示文本
案例,創建一個按鈕,初始文本為1
要求:
- 每點擊一次,則讓文本數字加1
涉及知識點:
- 按鈕控件的創建
- 按鈕文本的設置和獲取
- 按鈕點擊信號的監聽
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QPushButton(w)
btn.setText("1") # 設置初始文本
def btn_():
count = int(btn.text())
count += 1 # 加一功能
btn.setText(str(count))
btn.pressed.connect(btn_) # 監聽事件
w.setVisible(True) # 設置為可見
sys.exit(app.exec_())
1.1.3 圖標相關
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
setIcon(QIcon) # 設置圖標
setIconSize(ASize) # 設置圖標大小
icon() # 獲取圖標
iconSize() # 獲取圖標大小
"""
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QPushButton(w)
btn.setText("Button") # 設置初始文本
icon = QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg") # 設置圖片
btn.setIcon(icon) # 設置圖標
size = QSize(20, 20) # 輸入圖標大小
btn.setIconSize(size) # 設置圖標大小
w.setVisible(True) # 設置為可見
sys.exit(app.exec_())
1.1.4 設置快捷鍵
作用:
- 通過指定的快捷鍵,觸發按鈕的點擊
方式:
- 有提示文本:如果提示文本包含 & 符號,則QAbstractButton會自動創建快捷鍵
- 無提示文本:
setShortcut("Alt + G")
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QPushButton(w)
btn.clicked.connect(lambda: print("按鈕被按下"))
# btn.setText("a&bc") # 有文本創建,快捷鍵為 Alt + b
btn.setText("點我")
btn.setShortcut("Alt+G") # 無文本的創建方法
w.show()
sys.exit(app.exec_())
1.1.5 按鈕自動重復
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
# 當一直摁下不松開觸發重復
setAutoRepeat(bool) # 設置自動重復
setAutoRepeatInterval(ms) # 設置自動重復檢測間隔
setAutoRepeatDelay(ms) # 設置初次檢測延遲
autoRepeat() # 獲取是否自動重復
autoRepeatInterval() # 獲取自動重復檢測間隔
autoRepeatDelay() # 獲取初次檢測延遲時長
"""
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QPushButton(w)
btn.setText("點我")
btn.clicked.connect(lambda: print("點擊一次"))
btn.setAutoRepeat(True) # 開啟重復
btn.setAutoRepeatInterval(1000) # 設置 1 秒間隔
btn.setAutoRepeatDelay(2000) # 摁下兩秒后觸發重復
# 獲取值
print(btn.autoRepeat())
print(btn.autoRepeatInterval())
print(btn.autoRepeatDelay())
w.show()
sys.exit(app.exec_())
1.1.6 狀態檢測
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
isDown() # 是否按下按鈕
setDown(bool) # 設置按鈕是否被按下
isChecked() # 是否選中了按鈕
setChecked() # 設置按鈕是否被選中
isCheckable() # 按鈕是否可以被選中
setCheckable(bool) # 設置按鈕是否可以被選中
toggle() # 切換選中與非選中狀態
# 繼承與QWidget中能使用的狀態
isEnabled() # 判斷按鈕是否能點擊
setEnabled(bool) # 設置按鈕是否能點擊
"""
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QPushButton(w)
btn.setText("QPushButton")
btn.move(50, 0)
btn2 = QRadioButton(w)
btn2.setText("QRadioButton")
btn2.move(50, 50)
btn3 = QCheckBox(w)
btn3.setText("QCheckBox")
btn3.move(50, 100)
# 把三個按鈕全部置為按下狀態
btn.setStyleSheet("QPushButton:pressed {background-color: red;}")
btn.setDown(True)
btn2.setChecked(True)
btn3.toggle()
# 打印狀態
print(btn.isCheckable())
print(btn2.isChecked())
print(btn3.isDown())
w.show()
sys.exit(app.exec_())
1.1.7 排他性
如果同時存在多個按鈕,而此時所有按鈕有設置了排他性,則,在同一時刻只能選中一個按鈕
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
autoExclusion() # 是否有排他性,一般按鈕都是 False 只有單選按鈕是 True
setAutoExclusion() # 設置自動排他性
# 使用場景,設定按鈕中的按鈕,單選特性,范圍是同一級別
"""
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
for i in range(3):
btn = QPushButton(w)
btn.setText(f"QPushButton{i}")
btn.move(i * 50, i * 50)
btn.setAutoExclusive(True) # 設置具有自動排他性
print(btn.autoExclusive()) # 查看是否有自動排他性
btn.setCheckable(True) # 使得按鈕可以被選中
w.show()
sys.exit(app.exec_())
1.1.8 點擊
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
click() 普通點擊
animateClick() # 動畫點擊
"""
app = QApplication(sys.argv)
w = QWidget()
btn = QPushButton(w)
btn.setText("按鈕")
btn.pressed.connect(lambda: print("點擊了按鈕"))
btn.click() # 模擬用戶對按鈕的點擊
btn.animateClick(2000) # 點擊按鈕后,持續兩秒,再松開
w.show()
sys.exit(app.exec_())
1.1.9 設置點擊區域
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
# 通過方法重寫來實現
class MyBtn(QPushButton):
def hitButton(self, pos):
# print(pos.x()) 返回相對於按鈕左上角的坐標
# 如果點擊有效,就返回 True,才會發送信號;返回False就不會發射信號
return True if pos.x() < self.width() / 2 else False # 設置成只有點擊左半部分才有效
app = QApplication(sys.argv)
w = QWidget()
btn = MyBtn(w)
btn.setText("按鈕")
btn.pressed.connect(lambda: print("點擊了按鈕"))
w.show()
sys.exit(app.exec_())
1.1.10 信號
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
pressed() # 鼠標按下
released() # 鼠標釋放,鼠標在控件內松開;鼠標移出控件范圍后
clicked(checked = false) # 控件按下 + 控件內釋放
toggle(bool checked) # 切換信號(一般在單選框或者復選框中使用)
"""
app = QApplication(sys.argv)
w = QWidget()
btn = QPushButton(w)
btn.setText("按鈕")
btn.pressed.connect(lambda: print("鼠標按下了")) # 鼠標按下
btn.released.connect(lambda: print("鼠標釋放了")) # 鼠標釋放
btn.clicked.connect(lambda value: print("鼠標被點擊", value)) # 鼠標被點擊
w.show()
sys.exit(app.exec_())
1.2 QPushButton
1.2.1 簡介
用來給用戶點擊,來完成某種動作的控件,一般是矩形
1.2.2 創建
QPushButton() # 創建一個無父控件的按鈕控件
QPushButton(parent) # 創建控件的同時,設置父控件
QPushButton(text, parent) # 創建控件的同時,設置提示文本的父控件
QPushButton(icon, text, parent) # 創建控件的同時,設置圖標和提示文本
1.2.3 菜單
當鼠標點擊按鈕時,會展開一系列的菜單
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
"""
setMenu(QMenu) # 設置菜單
menu() # 獲取菜單
showMenu() # 顯示菜單
# QMenu:
addMenu(QMenu) # 添加子菜單
addSeparator() # 添加分隔線
addAction(QAction) # 添加行為動作
# QMenu 控件設置
setTitle(str) # 設置標題
setIcon(QIcon) # 設置圖標
# QAction 設置
setText(str) # 設置文本內容
setIcon(QIcon) #
triggered # 監聽行為信號
"""
app = QApplication(sys.argv)
w = QWidget()
btn = QPushButton("File", w)
menu = QMenu(btn)
# 創建子菜單
open_recent = QMenu(menu)
open_recent.setTitle("最近打開") # 添加標題
# open_recent.setIcon()
act_n = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "新建", menu)
"""
相當於:
act_n = QAction()
act_n.setText("新建")
act_n.setIcon(QIcon("D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"))
act_n.setParent(menu)
"""
act_n.triggered.connect(lambda: print("正在新建文件"))
act_o = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "打開", menu)
act_o.triggered.connect(lambda: print("正在打開文件"))
act_e = QAction("退出", menu)
act_e.triggered.connect(lambda: print("正在退出應用"))
act_r = QAction("Python編程", menu)
act_r.triggered.connect(lambda: print("正在打開文件"))
# 子菜單設置
open_recent.addAction(act_r)
# 菜單設置
menu.addAction(act_n) # 添加動作
menu.addAction(act_o)
menu.addMenu(open_recent)
menu.addSeparator() # 添加分隔線
menu.addAction(act_e)
btn.setMenu(menu)
w.show()
btn.showMenu() # 展示菜單,可以獨立展示
sys.exit(app.exec_())
1.2.4 邊框
邊框是否扁平
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
btn = QPushButton("File", w)
print(btn.isFlat()) # 查看邊框是否為扁平化
btn.setFlat(True) # 設置扁平化
w.show()
sys.exit(app.exec_())
1.2.5 默認處理
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
btn1 = QPushButton("File1", w)
btn2 = QPushButton("File2", w)
btn2.move(100, 0)
btn1.setAutoDefault(True) # 設置為自動默認按鈕
print(btn1.autoDefault()) # 打印是否設置自動打印
btn2.setDefault(True) # 一開始就設置為默認
w.show()
sys.exit(app.exec_())
在某些GUI樣式中,默認按鈕被繪制,其周圍有一個額外的框架,最多三個像素或更多Qt會自動在自動默認按鈕周圍保留此空間。即自動默認按鈕可能會有稍微大點的提示對於具有QDialog父級的按鈕,此屬性的默認值為True;否則默認為False
1.2.5 信號
其信號大部分是繼承下來的,用法與父類類似
菜單請求信號:
customContextMenuRequested(QPoint)
:自定義上下文菜單請求信號setContextMenuPolicy(Qt.CustomContextMenu)
:設置信號Qt.DefaultContextMenu
:調用對象方法contextMenuEvent()
Qt.CustomContextMenu
:發射信號
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
class Window(QWidget):
def contextMenuEvent(self, evt):
# 如果為 Qt.DefaultContextMenu,就會運行這個函數
print("展示菜單") # 右擊窗口,會調用這個方法,只要在里面創建菜單就可以了
# 創建對象
menu = QMenu(self)
menu_s = QMenu("最近打開", menu)
# 創建動作
act_n = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "新建", menu)
act_n.triggered.connect(lambda: print("正在新建文件"))
act_o = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "打開", menu)
act_o.triggered.connect(lambda: print("正在打開文件"))
act_e = QAction("退出", menu)
act_e.triggered.connect(lambda: print("正在退出應用"))
act_r = QAction("Python編程", menu)
act_r.triggered.connect(lambda: print("正在打開文件"))
# 添加動作
menu.addAction(act_n)
menu.addAction(act_o)
menu.addAction(act_e)
menu.addAction(act_r)
menu.addMenu(menu_s)
# 展示菜單
menu.exec_(evt.globalPos()) # 在鼠標右鍵的位置打開菜單,參數是窗口坐標
app = QApplication(sys.argv)
w = Window()
w.resize(500, 500)
# Qt.CustomContextMenu,就會發送信號調用此函數
def show_menu(point):
print("展示菜單", point)
# 創建對象
menu = QMenu(w)
menu_s = QMenu("最近打開", menu)
# 創建動作
act_n = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "新建", menu)
act_n.triggered.connect(lambda: print("正在新建文件"))
act_o = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "打開", menu)
act_o.triggered.connect(lambda: print("正在打開文件"))
act_e = QAction("退出", menu)
act_e.triggered.connect(lambda: print("正在退出應用"))
act_r = QAction("Python編程", menu)
act_r.triggered.connect(lambda: print("正在打開文件"))
# 添加動作
menu.addAction(act_n)
menu.addAction(act_o)
menu.addAction(act_e)
menu.addAction(act_r)
menu.addMenu(menu_s)
# 展示菜單
dest_point = w.mapToGlobal(point) # 將坐標轉換為全局的坐標
menu.exec_(dest_point) # 在鼠標右鍵的位置打開菜單,參數是窗口坐標
# w.setContextMenuPolicy(Qt.DefaultContextMenu) # 這個會運行重寫的方法
w.setContextMenuPolicy(Qt.CustomContextMenu) # 其不會運行重寫的方法,但是會有信號傳輸
w.customContextMenuRequested.connect(show_menu) # 監測信號
w.show()
sys.exit(app.exec_())
1.3 QCommandLinkButton
1.3.1 描述
命令鏈接是 window vista 引入的新控件
它的用途類似於單選按鈕的用途,因為它用於在一組互斥選項之間的選擇
命令鏈接按鈕不應單獨使用,而應作為向導和對話框中單選按鈕的替代選項
外觀通常類似於平面按鈕的外觀,但除了普通按鈕文本之外,它還允許描述性文字
繼承自QPushButton
1.3.2 語法
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QCommandLinkButton("標題", "描述", w)
btn.setText("標題文本內容") # 設置標題
print(btn.text()) # 獲得標題
btn.setDescription("設置描述內容") # 設置描述
print(btn.description()) # 獲得描述
btn.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg")) # 設置圖標
w.show()
sys.exit(app.exec_())
1.4 RadioButton
1.4.1 描述
一般用於給用戶提供若干個選項中的單選操作,當選中一個時,會自動取消上一個
當按鈕選中時,會有一個圓圈圖標,用於標識用戶的選中狀態
繼承自QAbstractButton
1.4.2 功能作用
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
# 創建,在同一個組或同一個父對象內,值能選擇一個,但是如果有r_btn1.setAutoExclusive(False)其可以選擇多個(沒有排他性)
r_btn1 = QRadioButton("男&male", w) # 使用 & 設置快捷鍵 Alt + m
r_btn1.move(100, 0)
r_btn1.setChecked(True) # 自動選中
r_btn2 = QRadioButton("女female", w)
r_btn2.setShortcut("Alt+F") # 無文本創建快捷鍵
w.show()
sys.exit(app.exec_())
幾乎父類的所有方法,子類都可以調用
1.4.3 信號
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
r_btn1 = QRadioButton("男", w)
r_btn1.move(100, 0)
r_btn1.setChecked(True)
r_btn2 = QRadioButton("女", w)
r_btn2.toggled.connect(lambda isChecked: print(isChecked)) # 返回bool,可以得到按鈕是否被選中
w.show()
sys.exit(app.exec_())
父類的所有信號,子類都可以使用
1.4.4 多組排斥
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
r_btn1 = QRadioButton("男", w)
r_btn1.move(100, 0)
r_btn2 = QRadioButton("女", w)
# 兩組
r_btn3 = QRadioButton("yes", w)
r_btn3.move(100, 40)
r_btn4 = QRadioButton("no", w)
r_btn4.move(0, 40)
# 解決方法1:繼承不一樣的父對象
# 解決方法2:使用按鈕組 QButtonGroup
g1 = QButtonGroup(w) # 創建
g1.addButton(r_btn1) # 添加按鈕
g1.addButton(r_btn2) # 添加按鈕
g1.addButton(r_btn3) # 添加按鈕
g1.removeButton(r_btn3) # 移除按鈕
g2 = QButtonGroup(w) # 創建
g2.addButton(r_btn3) # 添加按鈕
g2.addButton(r_btn4) # 添加按鈕
w.show()
sys.exit(app.exec_())
QButtonGroup:
描述:
- 提供一個抽象的按鈕容器,可以將多個按鈕划分為一組
- 不具備可視化效果
- 一般放的都是可檢查的按鈕
- 繼承於QObject
功能:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) r_btn1 = QRadioButton("男", w) r_btn1.move(100, 0) r_btn2 = QRadioButton("女", w) r_btn2.setChecked(True) # id以及創建 g1 = QButtonGroup(w) # 創建 g1.addButton(r_btn1, 1) # 添加按鈕,同時設置id為1,系統自動分配的id為負值 g1.addButton(r_btn2, 2) # 添加按鈕,同時設置id為2 print(g1.button(1)) # 查看 id 為 1 的按鈕 # 手動綁定id g1.setId(r_btn1, 2) g1.setId(r_btn2, 1) print(g1.id(r_btn1)) # 查看指定按鈕的id print(g1.checkedId()) # 獲取選中的按鈕的id,如果都沒選中,則為-1 # 按鈕操作 # g1.removeButton(r_btn2) # 移除按鈕 print(g1.buttons()) # 查看組內有哪些按鈕 print(g1.button(1)) # 查看 id 為 1 的按鈕 print(g1.checkedButton().text()) # 查看選中的按鈕 # 獨占設置 g1.setExclusive(False) # 取消組內的互斥關系 print(g1.exclusive()) # 獲取組內是否有互斥關系 w.show() sys.exit(app.exec_())
信號使用
buttonClicked(int / QAbstractButton) # 當組內的按鈕點擊時,發射此信號 buttonPressed(int / QAbstractButton) # 當組內的按鈕按下時,發射此信號 buttonReleased(int / QAbstractButton) # 當組內的按鈕松開時,發射此信號 buttonToggled(int / QAbstractButton) # 當組內的按鈕切換狀態時,發射此信號 # 比如 g1.buttonToggled[int].connect(lambda val: print(val))
注意:
- 通過buttonToggle[int].connect(fn) :來獲取指定響應返回類型的信號,int 為按鈕的 id 值
- 如果一個對象向外界提供的信號名稱一樣,但參數不一樣;外界在使用信號時,可以使用如下格式進行選擇
signal_name[type]
1.5 QCheckButton
1.5.1 描述
一般用於給用戶提供若干個選項中的多選操作,可以都選;也可以都不選
左側會有一個方框圖標,標識用戶的選中狀態
繼承自QAbstractButton
1.5.2 功能作用
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
bc = QCheckBox("python", w) # 創建復選框對象
bc.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg")) # 設置圖標
# 其可以繼承父類的操作
# 設置是否三態
bc.setTristate(True) # 開啟三態
print(bc.isTristate()) # 查看是否開啟三態
# 設復選框狀態
bc.setCheckState(Qt.PartiallyChecked) # 部分選中
print(bc.checkState()) # 查看選中狀態
w.show()
sys.exit(app.exec_())
復選框的狀態:
Qt.Unchecked
:該項目未選中 0Qt.PartiallyChecked
:部分選中 1Qt.Checked
:全部選中 2
1.5.3 信號
stateChanged(int state) # 選中或清除選中時,發射此信號
其他的信號都是通過繼承而來
1.6 QToolButton
1.6.1 描述
提供了一個快速訪問按鈕
通常是在工具欄內部使用
工具按鈕通常不顯示文本標簽,而是顯示圖標,如保存文件的圖標
繼承自QAbstractButton
1.6.2 功能作用
1.6.2.1 創建
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QToolButton(w) # 創建一個按鈕
btn.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg")) # 添加圖標
btn.setIconSize(QSize(100, 100)) # 設置圖標大小
btn.setText("xxx") # 設置文本,如果有圖標又有文本,那么默認顯示圖標
btn.setToolTip("這是一個工具欄按鈕") # 設置提示
btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) # 改變按鈕風格,文本顯示在圖標下方,其他類型的風格可以在官方文檔或者源碼中查看
print(btn.toolButtonStyle()) # 獲得按鈕風格取值
w.show()
sys.exit(app.exec_())
1.6.2.2 自動提升
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QToolButton(w)
btn.setArrowType(Qt.UpArrow) # 設置向上的箭頭,其他的請到官方文檔或源碼中查找,在設置箭頭后,以前設置的圖標將被覆蓋
print(btn.arrowType()) # 獲取箭頭類型
btn.setAutoRaise(True) # 設置自動提升,類似於setFlat()
print(btn.autoRaise()) # 獲取是否開啟自動提升效果
w.show()
sys.exit(app.exec_())
1.6.2.3 菜單按鈕
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QToolButton(w)
btn.setArrowType(Qt.DownArrow) # 創建一個向下的箭頭
btn.setText("工具欄")
btn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
menu = QMenu(btn)
sub_menu = QMenu("子菜單", menu)
# 創建動作
act = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "行為", menu)
act.triggered.connect(lambda: print("正在執行行為"))
# 設置子菜單
sub_menu.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"))
# 設置主菜單
menu.addAction(act)
menu.addMenu(sub_menu)
btn.setMenu(menu)
# 注意,默認的菜單彈出方式為,按住按鈕一會兒才會彈出菜單 QToolButton.DelayedPopup
btn.setPopupMode(QToolButton.MenuButtonPopup) # 有一個專門的指示箭頭,點擊箭頭展示
# btn.setPopupMode(QToolButton.InstantPopup) # 點了按鈕就彈出,其會影響信號的發射
print(btn.popupMode()) # 獲得菜單彈出方式
w.show()
sys.exit(app.exec_())
1.6.3 信號
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
btn = QToolButton(w)
btn.setArrowType(Qt.LeftArrow)
btn.setText("工具欄")
btn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
menu = QMenu(btn)
sub_menu = QMenu("子菜單", menu)
# 創建動作
act = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"), "行為", menu)
act.triggered.connect(lambda: print("正在執行行為"))
act.setData([1, 2, 3]) # 行為可以傳遞數據
# 設置子菜單
sub_menu.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg"))
# 設置主菜單
menu.addAction(act)
menu.addMenu(sub_menu)
btn.triggered.connect(lambda act: print("按鈕發送信號", act.data())) # 單點擊菜單時,也會觸發這個槽,同時可以獲取到哪個行為觸發了這個槽,act.data() 可以接收行為設置的數據,可以對不同額行為,綁定不同的數據,在出口對數據進行操作
btn.setMenu(menu)
btn.setPopupMode(QToolButton.MenuButtonPopup)
w.show()
sys.exit(app.exec_())