在QMenu中指定位置插入新项目

时间:2019-01-09 23:58:44

标签: python pyqt pyqt4 qmenu

我正在尝试实现QMenu的以下设计:

|  Add New Item  |
------------------
|   New Item 1   |
|   New Item 2   |
|   New Item 3   |
------------------
| Default Item 1 |
| Default Item 2 |

假设它是一个新的QMenu,则默认设计看起来有些谎言:

|  Add New Item  |
------------------
| Default Item 1 |
| Default Item 2 |

在我的代码中,虽然我能够创建新项目,但遇到了2个问题。

  1. 对于我在使用选项-Add new item时指定的任何新项目,默认的3个选项会重新添加到QMenu中,这将导致重复的选项...如果添加在self.qmenu.clear()中,当它解析重复的默认项目时,不会填充任何新项目...

  2. 是否可以将新项目放在add new itemdefault items之间?或者,将2个qmenus组合为一个,类似于在QVBoxLayout中添加小部件的方式,您可以在其中控制顺序?

提前了解任何见解。

class Example(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.initUI()


    def initUI(self):         
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Context menu')    
        self.qmenu = QtGui.QMenu()

    def contextMenuEvent(self, event):
        # self.qmenu.clear()

        # For adding in new item(s)
        add_item_action = QtGui.QAction('Add new item', self)
        slot = functools.partial(self.add_new_item)
        add_item_action.triggered.connect(slot)
        self.qmenu.addAction(add_item_action)
        self.qmenu.addSeparator()

        # Default items
        def_item_01 = self.qmenu.addAction("Default Item A")
        def_item_02 = self.qmenu.addAction("Default Item B")
        action = self.qmenu.exec_(self.mapToGlobal(event.pos()))

    def add_new_item(self):
        new_item_name = raw_input('Name of new item : ')
        if new_item_name:
            self.qmenu.addSeparator()
            # The new items should be checked upon created
            new_action = QtGui.QAction(new_item_name, self.qmenu, checkable=True)
            new_action.setChecked(True)
            self.qmenu.addAction(new_action)

my_win = Example()
my_win.show()

1 个答案:

答案 0 :(得分:2)

您打几次contextMenuEvent?每次单击右键以使您不断添加Defaults项时,您认为最好只添加一次以免添加重复项吗?那是正确的选择。

另一方面,如果要在QMenu中插入项目,则必须使用insertAction()

最后不要使用raw_input()(或python3中的input()),因为它们会阻塞并冻结GUI,最好使用一个对话框询问您的数据。

class Example(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.initUI()

    def initUI(self):         
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Context menu')    

        self.qmenu = QtGui.QMenu()
        add_item_action = QtGui.QAction('Add new item', self,
            triggered=self.add_new_item)
        self.qmenu.addAction(add_item_action)
        self.qmenu.addSeparator()

        self.separator =  self.qmenu.addSeparator()
        # Default items
        def_item_01 = self.qmenu.addAction("Default Item A")
        def_item_02 = self.qmenu.addAction("Default Item B")

    def contextMenuEvent(self, event):
        action = self.qmenu.exec_(self.mapToGlobal(event.pos()))

    @QtCore.pyqtSlot()
    def add_new_item(self):
        new_item_name, ok = QtGui.QInputDialog.getText(self, "name of item", "Name of new item : ")
        if ok:
            new_action = QtGui.QAction(new_item_name, self.qmenu, checkable=True)
            self.qmenu.insertAction(self.separator, new_action)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    my_win = Example()
    my_win.show()
    sys.exit(app.exec_())