2013-10-08 3 views
1

У меня есть QTableView, который создается таким образом:PyQT QTableView выбрать несмежный набор строк

self.preset_delegate = PresetDelegate() # used to provide a combobox for making a selection from a set of options, column 0 
    self.model_filelist = QtGui.QStandardItemModel() 
    self.model_filelist.setHorizontalHeaderLabels(HEADER_LABELS) 
    self.list_filelist = QtGui.QTableView() 
    self.list_filelist.horizontalHeader().setResizeMode(QtGui.QHeaderView.Interactive) 
    self.list_filelist.setItemDelegateForColumn(0, self.preset_delegate) 
    self.list_filelist.setModel(self.model_filelist) 
    self.list_filelist.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 

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

Это псевдо-код для того, что я использую, чтобы сделать выбор:

files = [str(self.model_filelist.data(self.model_filelist.index(x,1)).toString()) for x in range(self.model_filelist.rowCount())] 
    self.list_filelist.clearSelection() 
    for x in match_set: 
     match_index = files.index(x) 
     model_index = self.model_filelist.index(match_index,1) # first column is okay 
     self.list_filelist.selectionModel().select(model_index, QtGui.QItemSelectionModel.Select | QtGui.QItemSelectionModel.Current) 

Моя проблема заключается в выборе модели с флагом на самой последней строке. Я использую SelectCurrent, ToggleCurrent или Select | Текущий или Toggle | Текущий, я получаю только последний элемент в моем match_set, оставшемся выбранным в конце цикла. По мере выполнения цикла выбор изменен с одного элемента на другой, вместо добавления новой строки в набор выбора. Я надеюсь, что в этом есть смысл.

Я точно знал, что флаг SelectCurrent - это способ сделать это, но он не работает для меня. Какие-либо предложения? (python 2.6.7, Fedora 14, Qt4.4. Я не могу быть уверен)

+0

Я не думаю, что я когда-либо пробыл 18 часов, когда никто не предлагал. Я изменил код, чтобы использовать функцию select(), которая принимает QItemSelection, и я загружаю ItemSelection с помощью набора объектов ItemSelectionRange, которые обертывают интересующие меня индексы модели. Кажется, это работает. –

+0

Если у вас есть решение, вы можете ответить на свой вопрос и принять его. Поощряется даже, есть значок для этого! –

+0

@Lego, хорошо, сделаю. –

ответ

1

В соответствии с комментариями к вопросу. Я не решил, почему исходный код не удался, но я нашел, что это сработало:

Используйте версию select(), которая принимает объект QItemSelection, и загружает этот объект с объектами QItemSelectRange, которые переносят ModelIndex в строки, которые я заинтересованный.

Смежные вопросы