2016-06-17 3 views
0

У меня есть таблица, где я позволил ExtendedSelection:Как выбрать несколько строк в QTableWidget?

table.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 

Когда я закрываю интерфейс я использую QSettings помнить любые выбранные строки. Когда я снова открываю свой пользовательский интерфейс, я хочу, чтобы он автоматически автоматически перебирал строки.

у меня есть, но это заканчивается только выбрать последний выбранный ряд:

QSETTINGS = [1, 2, 3] # Indicates row 1, 2 and 3 should be selected 

for row in xrange(table.rowCount()): 
    table_item = table.item(row, 1) 
    row_data = table_item.data(QtCore.Qt.UserRole) 
    row_id = row_data 
    if row_id in QSETTINGS: 
     table.selectRow(row) # This ends up only making one row selected 

Что я должен использовать вместо table.selectRow(row) для того, чтобы убедиться, что выбрать не только одну строку?


Редактировать

В моей оригинальный вопрос, я сказал, что с помощью QtGui.QAbstractItemView.MultiSelection. Однако я не. Я использую QtGui.QAbstractItemView.ExtendedSelection, и поэтому код выбора строки явно не работает. Временно переключаясь на MultiSelection, выбирая строки, а затем переключайтесь обратно на ExtendedSelection, код в моем вопросе отлично работает.

ответ

1

Временно устанавливая режим выбора MultiSelection, каждая строка s избран.

QSETTINGS = [1, 2, 3] # Indicates row 1, 2 and 3 should be selected 

# Temporarily set MultiSelection 
table.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) 

for row in xrange(table.rowCount()): 
    table_item = table.item(row, 1) 
    row_data = table_item.data(QtCore.Qt.UserRole) 
    row_id = row_data 
    if row_id in QSETTINGS: 
     table.selectRow(row) # This ends up only making one row selected 

# Revert MultiSelection to ExtendedSelection 
table.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 
+0

В качестве побочного примечания, если вы выберете все строки, это будет простой способ сделать инвертированный выбор. Спасибо за ответ! –

1

Вы должны использовать setSelected на каждом QTableWidgetItem

for row in xrange(table.rowCount()): 
    table_item = table.item(row, 1) 
    row_data = table_item.data(QtCore.Qt.UserRole) 
    row_id = row_data 
    if row_id in QSETTINGS: 
     for col in table.columnCount(): 
      item = table.item(row, col) 
      if item: 
       item.setSelected(True) 
0

в этом примере table.selectRow(i) работает на множественного выбора:

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 

class MyTableWidget(QtWidgets.QTableWidget): 
    def __init__(self, parent = None): 
     QtWidgets.QTableWidget.__init__(self, parent) 
     self.setRowCount(5) 
     self.setColumnCount(3) 
     self.items = [['a1','b1', 'c1'], ['a2','b2','c2'], ['a3','b3','c3'], ['a4','b4','c4'], ['a5','b5','c5']] 
     self.hh = ['a', 'b','c'] 
     self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) 
     selected = [1,2,4] 
     self.setSel(selected) 

     for r in range(0,len(self.items)): 
      for c in range(0,len(self.items[0])): 
       item = QtWidgets.QTableWidgetItem() 
       item.setText(self.items[r][c]) 
       item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable) 
       self.setItem(r,c,item) 

    def setSel(self, selection): 
     for i in selection: 
      self.selectRow(i) 

app = QtWidgets.QApplication(sys.argv) 
widget = MyTableWidget() 
widget.show() 
sys.exit(app.exec_()) 

я получить поведение вы описали, если я называю setSelectionMode после установки выбора

+0

Извините, я использовал 'ExtendedSelection', а не' MultiSelection'. Теперь я вижу, почему с моим кодом выбирается только одна строка. Это потому, что я не использую MultiSelection, в основном. Поэтому временно установите это, чтобы исправить мою проблему. – fredrik

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