pyqt pushButton和toolButton菜单 [重复] 。

问题描述 投票:0回答:1

我试图在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_())
python pyqt pyqt5
1个回答
1
投票

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; }')
© www.soinside.com 2019 - 2024. All rights reserved.