Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
在QAction菜单项-python中存储其他数据_Python_Pyside - Fatal编程技术网

在QAction菜单项-python中存储其他数据

在QAction菜单项-python中存储其他数据,python,pyside,Python,Pyside,我有一个通过for循环生成的动态qmenu。我已经将其分解为最基本的属性。我想知道的是,我是否可以创建一个定制的QMenuItem,以便在每个菜单项中存储一个实际的对象?目前它只支持用作名称的字符串 如何在菜单项中存储其他数据/信息 我想设置显示文本,就像普通文本一样,然后在for循环中,为每个项目添加一个类对象或某种类型的数据。我在for循环中放置了伪代码,但它被注释掉了 我以为创建自定义QAction项并从QAction继承已经很接近了,但在尝试使用此项时,这似乎不起作用 class Act

我有一个通过for循环生成的动态qmenu。我已经将其分解为最基本的属性。我想知道的是,我是否可以创建一个定制的QMenuItem,以便在每个菜单项中存储一个实际的对象?目前它只支持用作名称的字符串

如何在菜单项中存储其他数据/信息

我想设置显示文本,就像普通文本一样,然后在for循环中,为每个项目添加一个类对象或某种类型的数据。我在for循环中放置了伪代码,但它被注释掉了

我以为创建自定义QAction项并从QAction继承已经很接近了,但在尝试使用此项时,这似乎不起作用

class ActionObject( QtGui.QAction ):
    def __init__( self, text="", parent=None ):
        super( ActionObject, self ).__init__( parent )
        self.data = None


您可以简单地使用setData来设置数据,下面是一个工作示例,我更改了您的代码位

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore
from functools import partial

class Person():
    def __init__(self, name="", age=None):
        self.name = name
        self.age = age

    def getName(self):
        return self.name

# Main Widget
# ------------------------------------------------------------------------------
class ExampleWidget(QtGui.QWidget):

    def __init__(self,):
        super(ExampleWidget, self).__init__()

        self.initUI()


    def initUI(self):
        # formatting
        self.setWindowTitle("Example")

        # context menu
        self.main_menu = QtGui.QMenu()

        self.sub_menu = QtGui.QMenu("Great")
        self.main_menu.addMenu(self.sub_menu)


        names = ["Joe","Kevin","Amy","Doug","Jenny"]

        # sub-menu
        for index, name in enumerate(names):
            fancyName = "%s - %s" % (index, name)
            action = self.sub_menu.addAction( fancyName )
            action.setData(Person(name=name))
            action.triggered.connect(partial(self.menu_action, action))

        # widgets        
        self.factionsList = QtGui.QListWidget()

        # signal
        self.factionsList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.factionsList.customContextMenuRequested.connect(self.on_context_menu_factions)

        # layout
        self.mainLayout = QtGui.QGridLayout(self)
        self.mainLayout.addWidget(self.factionsList, 1, 0)
        self.show()

    def menu_action(self, item):
        itmData = item.data()
        print itmData.getName()


    def on_context_menu_factions(self, pos):
        self.main_menu.exec_( QtGui.QCursor.pos() )


# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    ex = ExampleWidget()
    res = app.exec_()
    sys.exit(res)

您可以简单地使用setData来设置数据,下面是一个工作示例,我更改了您的代码位

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore
from functools import partial

class Person():
    def __init__(self, name="", age=None):
        self.name = name
        self.age = age

    def getName(self):
        return self.name

# Main Widget
# ------------------------------------------------------------------------------
class ExampleWidget(QtGui.QWidget):

    def __init__(self,):
        super(ExampleWidget, self).__init__()

        self.initUI()


    def initUI(self):
        # formatting
        self.setWindowTitle("Example")

        # context menu
        self.main_menu = QtGui.QMenu()

        self.sub_menu = QtGui.QMenu("Great")
        self.main_menu.addMenu(self.sub_menu)


        names = ["Joe","Kevin","Amy","Doug","Jenny"]

        # sub-menu
        for index, name in enumerate(names):
            fancyName = "%s - %s" % (index, name)
            action = self.sub_menu.addAction( fancyName )
            action.setData(Person(name=name))
            action.triggered.connect(partial(self.menu_action, action))

        # widgets        
        self.factionsList = QtGui.QListWidget()

        # signal
        self.factionsList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.factionsList.customContextMenuRequested.connect(self.on_context_menu_factions)

        # layout
        self.mainLayout = QtGui.QGridLayout(self)
        self.mainLayout.addWidget(self.factionsList, 1, 0)
        self.show()

    def menu_action(self, item):
        itmData = item.data()
        print itmData.getName()


    def on_context_menu_factions(self, pos):
        self.main_menu.exec_( QtGui.QCursor.pos() )


# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    ex = ExampleWidget()
    res = app.exec_()
    sys.exit(res)

当然,正如Achayan所回答的,您可以使用
QAction
setData()
设置附加数据,并使用
data()
获取存储数据

然而,上面的内容将解决您的问题,让我们看看扩展QAction。
QWidget
QMenu
基于、实现允许传递
QAction
对象的
addAction

class ActionObject( QtGui.QAction ):
    def __init__( self, text="", parent=None ):
        super( ActionObject, self ).__init__(text, parent )
        self.data = None

class ExampleWidget(QtGui.QWidget):

        # ...[cut]...

        def initUI(self):

        # ...[cut]...

            # sub-menu
            for x in xrange(len(names)):
                name = str(x) + " - " + names[x]
                action = ActionObject(name, self.sub_menu)
                action.data = Person()
                action.triggered.connect(self.menu_action)
                self.sub_menu.addAction(action)
父项已显式设置,因为它是
QWidget
的实现,而不是
QMenu


这就是PyQt/Pyside允许在几乎所有地方使用自定义对象的方式,而无需使用猴子补丁。

当然,正如Achayan回答的那样,您可以使用
QAction
setData()
设置附加数据,并使用
data()
获取存储数据

然而,上面的内容将解决您的问题,让我们看看扩展QAction。
QWidget
QMenu
基于、实现允许传递
QAction
对象的
addAction

class ActionObject( QtGui.QAction ):
    def __init__( self, text="", parent=None ):
        super( ActionObject, self ).__init__(text, parent )
        self.data = None

class ExampleWidget(QtGui.QWidget):

        # ...[cut]...

        def initUI(self):

        # ...[cut]...

            # sub-menu
            for x in xrange(len(names)):
                name = str(x) + " - " + names[x]
                action = ActionObject(name, self.sub_menu)
                action.data = Person()
                action.triggered.connect(self.menu_action)
                self.sub_menu.addAction(action)
父项已显式设置,因为它是
QWidget
的实现,而不是
QMenu


这就是PyQt/Pyside允许在几乎所有地方使用自定义对象的方式,而无需使用猴子补丁。

谢谢@kalmAcetA这有助于了解如何做到这一点谢谢谢谢@kalmAcetA这有助于了解如何做到这一点感谢对部分的需要?对部分的需要是什么?