Выбор элемента QTableView на основе атрибута данных QStandardItem

Что было бы наиболее эффективным и технически (Python/PyQt4) правильным способом произвольного множественного выбора в QTableView, который имеет модель, охватывающую иерархию QStandardItems (график data) с добавлением настраиваемого атрибута данных isSelected для каждого элемента.

Подробно: вместе с таблицей у меня есть график matplotlib, который выводит диапазоны (атрибут isSelected происходит непосредственно из этих диапазонов), которые соответствуют моим данным QTableView, и я хочу добавить немного взаимодействия между этими двумя элементами графического интерфейса.

то есть выбор графика matplotlib отражается в QTableView и наоборот (что я получаю, перехватывая изменение выбора для чтения соответствующих индексов и возвращая их обратно в график).

Надеюсь, это объяснение имеет смысл. Спасибо.


person decuman    schedule 03.05.2012    source источник


Ответы (1)


Как вы сказали, прямо сейчас у вас есть QTableView.selectionChanged(), возвращающий выбор обратно в ваш матплот. Наиболее эффективным подходом было бы, чтобы ваш матплот излучал сигнал для его выбора с соответствующими элементами.

Табличное представление уже хранит свой выбор в QItemSelectionModel, поэтому, насколько я понимаю, было бы избыточным и ненужным хранить собственный атрибут isSelected для элементов. Ваше представление matplot должно знать элементы, которые оно использует, и должно иметь возможность уведомлять табличное представление об изменениях выбора.

Ваше представление matplot может иметь сигнал, который вы испускаете, например selectionChanged(items), и может по-прежнему не знать о табличном представлении.

Ваше табличное представление, поскольку оно уже знает о представлении матплота, может подключиться к своему selectionChanged(items) матплоту и прослушивать изменения выбора. Даже если ваша таблица также испускает сигнал и ничего не знает о matplot, вы можете установить связь в любом родительском классе, который знает о них обоих.

Вот почему я думаю, что этот атрибут не нужен: единственный способ использовать этот атрибут — просмотреть всю модель, проверяя каждый элемент. Это не очень эффективно. Выбор должен происходить в ответ на испускаемый сигнал.

myMatPlotView.selectionchanged.connect(myTableView.matplotSelected)

И в вашем слоте matPlotSelected() вы можете использовать модель выбора, чтобы установить выбор предметов:

таблица

def matPlotSelected(self, qStandardItems):

    selModel = self.selectionModel()
    model = self.model()

    for item in qStandardItems:
        idx = model.indexFromItem(item)
        selModel.select(idx, selModel.Select)

Обновить

В комментариях вы предоставили фрагмент кода, который действительно помог выделить то, чего вы хотите достичь.

Ваш пример

def __init__(self):
    super(myDialog, self).__init__()
    self.t = QtGui.QTreeView()
    self.m = QtGui.QStandardItemModel()
    self.t.setModel(self.m)
    layout = QtGui.QVBoxLayout()
    layout.addWidget(self.t)
    self.setLayout(layout)
    self.l = [
        ['one', False], ['two', True], 
        ['three', False], ['four', True], 
        ['five', False]]
    self.populate()

def populate(self):
    self.m.clear()
    root = self.m.invisibleRootItem()
    for item in self.l:
        e = QtGui.QStandardItem()
        e.setText(item[0])
        root.appendRow(e)

Если это ваша реальная ситуация, то то, что я предложил выше, подходит следующим образом:

def populate(self):
    self.m.clear()
    root = self.m.invisibleRootItem()
    selModel = self.t.selectionModel()
    for item in self.l:
        e = QtGui.QStandardItem()
        e.setText(item[0])
        root.appendRow(e)

        if item[1]:
            idx = self.m.indexFromItem(e)
            selModel.select(idx, selModel.Select)
person jdi    schedule 03.05.2012
comment
Вот собственно тот момент, который я хотел уточнить. Насколько я знаю, есть два возможных варианта выбора. Во-первых, я предоставляю область QRect для setSelection() (что не имеет отношения к моему случаю), или, во-вторых, я выделяю QModelIndexes для своего QTreeView's selectionModel(), но я не знаю эти индексы, пока не пройдусь по всем элементам модели, чтобы идентифицировать их. Вопрос в том, как получить индексы модели только для тех «помеченных» элементов, которые я хочу выбрать. - person decuman; 04.05.2012
comment
@decuman: Между нами может быть разногласие по поводу вашей реальной проблемы. Я только что обновил свой пример, чтобы показать, как преобразовывать элементы в индексы. Это решает проблему? Ваш matplotview уже должен знать элементы и отправлять их в сигнале. - person jdi; 04.05.2012
comment
Извините за путаницу: более кратко и абстрактно: существует массив данных (список) с некоторыми элементами, помеченными как «выбранные», который заполняет иерархический QStandarItemModel. Как сделать, чтобы эти элементы, помеченные как «выбранные», стали выбранными при инициализации QTreeView? - person decuman; 04.05.2012
comment
@decuman: Мне кажется, вы обходите ту же проблему. Выбор один и тот же независимо от того, происходит ли он внутри инициализации TreeView или в слоте, который срабатывает позже. Где бы вы ни заполняли свою модель, у вас будут элементы прямо там, и вы можете проверить их атрибут isSelected. Вы просто используете подход к выбору, указанный выше. Вам интересно, как отфильтровать этот список данных? И да... я в замешательстве. - person jdi; 04.05.2012
comment
Да. вероятно, мой случай связан с фильтрацией данных. Вот небольшой фрагмент кода КОД. Существует список с состояниями выбора True/False, которые я хочу выбрать при инициализации QTableView. - person decuman; 04.05.2012
comment
@decuman: Хорошо, теперь, увидев пример кода, я могу что-то прокомментировать. Смотрите обновления. - person jdi; 04.05.2012
comment
Это был ответ! Я знал, что это должно быть просто. Большое спасибо. - person decuman; 04.05.2012