我试图在pushButton和toolButton中创建下拉菜单,在pyqt5中如何使下拉菜单没有 "向下箭头 "图标,当我点击pushButton时下拉菜单迅速出现,但在tool按钮中却不能正常工作,我必须按下几秒钟后下拉菜单才会出现。
这里是代码。
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QMenu,QDesktopWidget
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(260, 170, 75, 23))
self.pushButton.setObjectName("pushButton")
self.toolButton = QtWidgets.QToolButton(self.centralwidget)
self.toolButton.setGeometry(QtCore.QRect(470, 170, 61, 31))
self.toolButton.setObjectName("toolButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
menu_items = [
{'Source':['google','yahoo','Reuters',]},
'test1',
'test2',
'test3',
]
menu =QMenu()
menu.triggered.connect(lambda x:print(x.text()))
self.add_menu(menu_items,menu)
self.pushButton.setMenu(menu)
self.toolButton.setMenu(menu)
def add_menu(self,data,menu_obj):
if isinstance(data,dict):
for k,v in data.items():
sub_menu = QMenu(k,menu_obj)
menu_obj.addMenu(sub_menu)
self.add_menu(v,sub_menu)
elif isinstance(data,list):
for element in data:
self.add_menu(element,menu_obj)
else:
action = menu_obj.addAction(data)
action.setIconVisibleInMenu(False)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "pushButton"))
self.toolButton.setText(_translate("MainWindow", "toolButton"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
QToolButton弹出所需的延迟是默认的行为,记录在 popupMode()
属性。如果你想立即显示菜单,只需使用 InstantPopup
:
self.toolButton.setPopupMode(QtWidgets.QToolButton.InstantPopup)
需要注意的是,在某些样式下,当QToolButton被设置为菜单时,这可能会在按钮右边显示一个小箭头(或一个很小的方块),而且在任何情况下,QPushButtons都可能不会阻止显示箭头。
解决方案是使用样式表禁用箭头指示器。
你可以在应用范围内设置,这样任何带有菜单的按钮都不会显示箭头。
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet('QAbstractButton::menu-indicator { image: none; }')
请注意,上面的设置将适用于 任何 QAbstractButton的后代(最重要的是QToolButton,QPushButton),但你可以选择只为特定的类设置。
app.setStyleSheet('QToolButton::menu-indicator { image: none; }')
或者,你也可以为单个按钮设置样式表。
self.toolButton.setStyleSheet('QToolButton::menu-indicator { image: none; }')
# this also works
self.toolButton.setStyleSheet('::menu-indicator { image: none; }')