带操作的PyQt4下拉列表

3 投票
2 回答
2699 浏览
提问于 2025-04-16 00:42

我想在PyQt4中创建一个下拉列表,当选择某个选项时可以执行一个动作。而且,有些选项在某些时候可能不可用。它们仍然应该出现在列表中,但要显示成灰色。

我试着把一个菜单附加到QToolButton上,但我甚至看不到这个菜单。请问该怎么做呢?

谢谢!
Nathan

2 个回答

0

QToolButton 有一个叫做 ToolButtonPopupMode 的选项,这个选项决定了它如何处理菜单和多个操作。当设置为 QToolButton::MenuButtonPopup 时,它会显示一个箭头,这个箭头通常出现在有菜单选项的按钮上。

要使用这个功能,你需要先设置合适的弹出模式,然后可以通过 setMenu 方法为 QToolButton 添加一个菜单,或者通过 addAction 方法添加一些操作。这样,QToolButton 就会在点击菜单时,按照预期的方式做出反应,无论是生成的操作还是实际的 QMenu。

2

使用弹出菜单。你可以在任何地方触发一个弹出菜单,方法是使用 QMenu.exec_ 这个方法,并传入你希望菜单出现的位置。

我创建了一个按钮,它会记住被点击的位置,然后把这个位置连接到创建和显示弹出菜单的方法上。

class MemoryButton(QPushButton):
    def __init__(self, *args, **kw):
        QPushButton.__init__(self, *args, **kw)
        self.last_mouse_pos = None

    def mousePressEvent(self, event):
        self.last_mouse_pos = event.pos()
        QPushButton.mousePressEvent(self, event)

    def mouseReleaseEvent(self, event):
        self.last_mouse_pos = event.pos()
        QPushButton.mouseReleaseEvent(self, event)

    def get_last_pos(self):
        if self.last_mouse_pos:
            return self.mapToGlobal(self.last_mouse_pos)
        else:
            return None

button = MemoryButton("Click Me!")

def popup_menu():
    popup = QMenu()
    menu = popup.addMenu("Do Action")

    def _action(check):
        print "Action Clicked!"

    menu.addAction("Action").triggered.connect(_action)                                                             
    popup.exec_(button.get_last_pos())

button.clicked.connect(popup_menu)

撰写回答