GUI學習之九——QToolButton的學習總結


QToolButton提供一個快速的訪問按鈕,通常在工具欄內使用,一般不顯示文本標簽而顯示圖標。

一.按鈕的樣式風格設置

可以按照下面的風格對按鈕進行樣式設置

從左到右依次是僅顯示圖標、僅顯示文字、圖標在文本左側和文字在圖標下側。代碼是這樣的

btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)  #設置樣式
btn.toolButtonStyle()                               #獲取樣式
#下面是樣式設置的枚舉值
Qt.ToolButtonIconOnly       #僅顯示圖標 ,返回值0
Qt.ToolButtonTextOnly       #僅顯示文本,返回值1
Qt.ToolButtonTextBesideIcon #文本顯示在圖標旁邊,返回值2
Qt.ToolButtonTextUnderIcon  #文本顯示在圖標下面,返回值3
Qt.ToolButtonFollowStyle    #遵循風格,返回值4

二. 箭頭樣式

好多可以擴展的工具欄按鈕是有擴展的箭頭的,上面圖上就是顯示了Word帶箭頭的工具欄按鈕。我們可以設置它的樣式

btn.setArrowType(Qt.RightArrow)
print(btn.arrowType())

Qt.NoArrow             #無箭頭,返回值0
Qt.UpArrow             #向上箭頭,返回值1
Qt.DownArrow           #向下箭頭,返回值2
Qt.LeftArrow           #向左箭頭,返回值3
Qt.RightArrow          #向右箭頭,返回值4      

這里要清楚一點:箭頭的優先級是高於圖標的,就是說設置了箭頭圖標就不顯示了(就目前的水平而言),但是如果樣式風格設置為只顯示文本箭頭也是不顯示的。

四.自動提升

工具欄按鈕的自動提升和QPushButton的扁平化是一樣的視覺效果,區別就是設置后當鼠標指向按鈕時外觀會發生變化,而扁平化只有點擊后才變化。(扁平化是QPushButton類里的功能,QToolButton是沒有的。)

btn.setAutoRaise(True)   #設置自動提升    
btn.autoRaise()          #獲取是否設置了自動提升

所以設置了autoraise后的按鈕外觀有三種效果:常規效果、鼠標指向時的效果和鼠標按下時的效果(圖中從左到右)。

 五.菜單應用

我們先做一個最簡單的目錄,並連接在工具欄按鈕上

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)

btn = QToolButton(window)
btn.setText('menu')

menu = QMenu()

action_1 = QAction(menu)
action_1.setText('1')
action_2 = QAction(menu)
action_2.setText('2')
menu.addAction(action_1)
menu.addAction(action_2)
btn.setMenu(menu)


window.show()
sys.exit(app.exec_())
工具欄菜單

運行后發現點擊按鈕菜單是不會彈出的,因為QPushButton的setmenu和QToolButton里的setmenu是不一樣的。只有鼠標按下按鈕並保持按下一段時間菜單才會彈出。就像瀏覽器的后退按鈕,按下保持后會彈出一個菜單

在后退按鈕上是有鼠標點擊的,但截圖時候鼠標無法截取。

btn.setPopupMode(QToolButton.MenuButtonPopup)  #設置菜單彈出模式
btn.popupMode()                                #獲取菜單彈出模式
#菜單彈出模式枚舉值
QToolButton.DelayedPopup   #延時彈出菜單,返回值0
QToolButton.MenuButtonPopup#鼠標按下箭頭時彈出,返回值1
QToolButton.InstantPopup   #鼠標按下按鈕時彈出,返回值2

 這里要注意一點:菜單的彈出有時候會影響到信號的發射

btn.clicked.connect(lambda :print('按鈕被按下'))

我們在這里加個信號和槽。

運行后會發現當菜單彈出時槽函數是不會運行的。

六.信號

除了繼承父類的信號外,QToolButton最常用的信號是

QToolButton.triggered()

這個triggered()和QAction類里的triggered()是不同的。他是可以傳遞一個Qaction作為參數的。

def btn_call(action):
    print(action)
btn.triggered.connect(btn_call)

可以把上面的代碼加工具欄菜單的案例中,運行一下看一看效果。

鑒於上面所說的方式,可以有個小用法:

當需要調用菜單里各個action時,原先的方式是對每個action進行定義,比方這樣(假設菜單里有action1和action2,每次點擊就打印"action1(2) is called",原先的方法是這樣的

action_1.triggered.connect(lambda :print('action1 is called'))
action_2.triggered.connect(lambda :print('action2 is called'))

但是如果菜單里的行為比較多,需要一個個寫,比較麻煩可以用QAction里的setdata()來綁定數據后直接獲取數據就可以

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)

btn = QToolButton(window)
btn.setText('menu')

btn.clicked.connect(lambda :print('按鈕被按下'))
menu = QMenu()

action_1 = QAction(menu)
action_1.setText('action1')

action_2 = QAction(menu)
action_2.setText('action2')
action_1.setData('action1 is called')   #action_1綁定數據
action_2.setData('action2 is called')   #action_2綁定數據

menu.addAction(action_1)

menu.addAction(action_2)
btn.setMenu(menu)

def btn_call(action):
    print(action.data())  #獲取action里的數據

btn.triggered.connect(btn_call)
window.show()
sys.exit(app.exec_())
trigged信號用法

這樣就不用每個對信號進行綁定了。


免責聲明!

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



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