如何通过QMenu将索引发送到插槽

1 投票
1 回答
1004 浏览
提问于 2025-04-18 11:27

我想用一个 QPushButton 按钮来实现类似 QComboBox 的功能,这个按钮会弹出一个 QMenu 菜单。具体来说,当我选择一个选项时,我希望能连接到一个槽函数,并让这个槽函数打印出我选择的项目的索引。相关的类定义如下:

from PySide import QtGui, QtCore

class PushIt(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)  
        menBut=self.makeQMenuButton()
        self.show()        

    def makeQMenuButton(self):
        button=QtGui.QPushButton("Men...you!", self)           
        pushMenu=QtGui.QMenu(button)
        #Set up each element of menu
        menBut1=pushMenu.addAction("Select me!")
        menBut2=pushMenu.addAction("Don't select me!")
        #What to do when each one is activated
        menBut1.activated[int].connect(self.menButSlot)
        menBut2.activated[int].connect(self.menButSlot) 
        button.setMenu(pushMenu)       
        return button

    @QtCore.Slot(int)
    def menButSlot(self, menDat):
        print "Menu button ", menDat

这个功能有点能用。比如,当我按下按钮1时,它返回:

Menu button -3

这和我用下拉框(combobox)得到的结果差不多,不过索引的计数似乎是从 -3 开始,而不是从 0 开始。我原本以为应该是从 0 开始的,所以我觉得我可能没有正确访问索引,而是在玩一些我不太懂的东西。

我是在 Windows 7 的 iPython/Anaconda 环境下使用 PySide。

1 个回答

2

根据Pavel Strakhov的评论,QMenu.activated这个信号已经不推荐使用了。他建议使用QSignalMapper来把一个索引发送到一个槽函数。这种方法效果很好,具体代码如下:

class PushIt(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)  
        menBut=self.makeQMenuButton()
        self.show()        

    def makeQMenuButton(self):
        button=QtGui.QPushButton("Men...you!", self)           
        #Set up qmenu and its items
        pushMenu=QtGui.QMenu(button)
        menBut1=pushMenu.addAction("Select me!")
        menBut2=pushMenu.addAction("Don't select me!")
        button.setMenu(pushMenu)   

        #set up mapping to create your own indexing scheme
        menuMapping=QtCore.QSignalMapper(self)
        menuMapping.setMapping(menBut1, 0)
        menuMapping.setMapping(menBut2, 1)

        menBut1.triggered.connect(menuMapping.map)
        menBut2.triggered.connect(menuMapping.map)
        menuMapping.mapped[int].connect(self.menButSlot) 

        return button

    @QtCore.Slot(int)
    def menButSlot(self, menDat):
        print "Home-grown triggered index:", menDat

这个方法的效果正是我所期望的(不过我还是对之前收到的奇怪的负值感到好奇,特别是关于activated的部分)。

撰写回答