Слот для новых предметов на указанных позициях в QMenu - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь добиться следующего дизайна 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 item и default 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 голосов
/ 10 января 2019

Сколько раз вы звоните contextMenuEvent? каждый раз, когда вы щелкаете вправо, чтобы непрерывно добавлять элементы по умолчанию, вам не кажется, что лучше добавлять его только один раз, чтобы не добавлять дубликаты?, что является правильным решением.

С другой стороны, если вы хотите вставить элемент в QMenu, вы должны использовать insertAction().

И, наконец, не используйте raw_input() (или input() в python3), поскольку они блокируют и замораживают графический интерфейс, лучше всего использовать диалоговое окно с запросом данных.

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_())
...