Разрешить только выбранные значения из выпадающего списка в поле автозаполнения

Я думаю, что структура данных, которую вы используете, неверна, потому что, когда я исполняю ваш код, она генерирует в два раза больше QAction s, я предлагаю структуру, где ключи - это имя QAction и значение списка данных:

{
 'item0': ['itemdata00', 'itemdata01', 'itemdata02'],
 'item1': ['itemdata10', 'itemdata11', 'itemdata12'],
  ...
}

Для построения начальной конфигурации используйте следующий скрипт:

create_settings.py

from PyQt5 import QtCore

if __name__ == '__main__':
    settings = QtCore.QSettings('test_org', 'my_app')
    d = {}
    for i in range(5):
        key = "item{}".format(i)
        value = ["itemdata{}{}".format(i, j) for j in range(3)]
        d[key] = value
    settings.setValue('menu_items', d)
    print(d)
    settings.sync()

С другой стороны Я думаю, что виджет, который вы хотите обработать уничтожением QAction s, должен взять на себя соответствующий QMenu, как показано ниже:

import sys
from PyQt5 import QtCore, QtWidgets

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        layout = QtWidgets.QHBoxLayout(self)

        menu_btn = QtWidgets.QPushButton()
        open_list_btn = QtWidgets.QPushButton('open list')
        layout.addWidget(menu_btn)
        layout.addWidget(open_list_btn)

        menu = QtWidgets.QMenu()
        menu_btn.setMenu(menu)

        self.menu_manager = MenuManager("menu_items", "Menu")
        menu.addMenu(self.menu_manager.menu)
        self.menu_manager.menu.triggered.connect(self.menu_clicked)
        open_list_btn.clicked.connect(self.menu_manager.show)

    def menu_clicked(self, action):
        itmData = action.data()
        print(itmData)


class MenuManager(QtWidgets.QWidget):
    def __init__(self, key, menuname, parent=None):
        super(MenuManager, self).__init__(parent)
        self.settings = QtCore.QSettings('test_org', 'my_app')
        self.key = key

        self.layout = QtWidgets.QVBoxLayout(self)
        self.listWidget = QtWidgets.QListWidget()
        self.remove_btn = QtWidgets.QPushButton('Remove')
        self.layout.addWidget(self.listWidget)
        self.layout.addWidget(self.remove_btn)
        self.remove_btn.clicked.connect(self.remove_items)

        self.menu = QtWidgets.QMenu(menuname)

        load_items = self.settings.value(self.key, [])
        for name, itemdata in load_items.items():
            action = QtWidgets.QAction(name, self.menu)
            action.setData(itemdata)
            self.menu.addAction(action)

            item = QtWidgets.QListWidgetItem(name)
            item.setData(QtCore.Qt.UserRole, action)
            self.listWidget.addItem(item)

    def remove_items(self):
        for item in self.listWidget.selectedItems():
            it = self.listWidget.takeItem(self.listWidget.row(item))
            action = it.data(QtCore.Qt.UserRole)
            self.menu.removeAction(action)
        self.sync_data()

    def sync_data(self):
        save_items = {}
        for i in range(self.listWidget.count()):
            it = self.listWidget.item(i)
            action = it.data(QtCore.Qt.UserRole)
            save_items[it.text()] = action.data()

        self.settings.setValue(self.key, save_items)
        self.settings.sync()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
0
задан Gman 18 January 2019 в 18:31
поделиться

1 ответ

Я решил использовать jQuery inputToken http://loopj.com/jquery-tokeninput/

Он прост в реализации и позволяет пользователю выбирать только доступные опции и не редактировать их. Может быть, другие найдут это полезным.

0
ответ дан Gman 18 January 2019 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: