PyQt5 基本語法(二):按鈕控件


按照繼承關系來學習

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 設置快捷鍵

作用:

  • 通過指定的快捷鍵,觸發按鈕的點擊

方式:

  1. 有提示文本:如果提示文本包含 & 符號,則QAbstractButton會自動創建快捷鍵
  2. 無提示文本: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:

  1. 描述:

    • 提供一個抽象的按鈕容器,可以將多個按鈕划分為一組
    • 不具備可視化效果
    • 一般放的都是可檢查的按鈕
    • 繼承於QObject
  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 = 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_())
    
  3. 信號使用

    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:該項目未選中 0
  • Qt.PartiallyChecked:部分選中 1
  • Qt.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_())


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM