Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用QMenu将索引发送到插槽_Python_Qt_Pyside_Qcombobox_Qmenu - Fatal编程技术网

Python 如何使用QMenu将索引发送到插槽

Python 如何使用QMenu将索引发送到插槽,python,qt,pyside,qcombobox,qmenu,Python,Qt,Pyside,Qcombobox,Qmenu,我试图使用一个弹出QMenu的QPushButton获取。也就是说,当选择一个动作时,我想连接到一个插槽,让插槽打印出所选项目的索引。相关类别定义: from PySide import QtGui, QtCore class PushIt(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) menBut=self.makeQMenuButton() sel

我试图使用一个弹出
QMenu
QPushButton
获取。也就是说,当选择一个动作时,我想连接到一个插槽,让插槽打印出所选项目的索引。相关类别定义:

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
这与我使用组合框得到的结果很接近,只是计数似乎是从-3开始的,而不是从0开始的。我假设它从0开始,所以我认为我根本没有访问索引,而是在玩弄我不理解的幂


我在Windows 7的iPython/Anaconda中使用PySide。

根据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

这正是我所希望的(尽管我仍然对我收到的
激活的
的奇怪负值感到好奇)。

激活的
信号已被弃用,不应在新代码中使用。改用
触发的
(但它没有int参数)。您可以使用
QSignalMapper
向插槽传递附加值。或者,您可以使用
QAction::setData
将数据附加到每个操作;您可以使用
self.sender()
在插槽中获取所选操作,并使用
data()
获取数据。@Pavel有趣的是:我假设QCOMBOX没有弃用它?
QCOMBOX::activated
没有弃用。请注意,我不敢接受自己的答案,但它似乎有效。如果我没有听到任何抗议,明天我会把它作为公认的答案进行核对。这应该归功于Pavel,所以请站在那里,投票支持他提出的这一解决方案