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_())
這樣就不用每個對信號進行綁定了。