Как выбрать ячейки в QtableWidget из списка индексов - PullRequest
0 голосов
/ 27 апреля 2018

В QtableWidget я хотел бы сохранить выбранные ячейки, пока я запрашиваю базу данных и возвращаю ранее выбранные ячейки обратно выбранным. Мое обновление элементов в QtableWidget очищает выбор. Пользователь может выбрать несмежные диапазоны ячеек.

У меня нет проблем с получением выделенных ячеек, прежде чем я обновляю данные с помощью QtableWidget.selectedIndexes ().

Я попытался перебрать список индексов и использовать setCurrentIndex, но это оставляет меня только с последним индексом. У меня кончились идеи. Как я могу восстановить выбранные диапазоны ячеек на основе сохраненных индексов?

QtableWidget with non-contiguous cells selected

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from room_chart import *
from datetime import datetime, timedelta

class Guest_form(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self)
        self.ui = Ui_rooms_chart()
        self.ui.setupUi(self)
        self.build_chart()
        self.ui.book.clicked.connect(self.book)

    def book(self):
        self.indexes = self.ui.room_chart.selectedIndexes()
        #Do stuff
        self.build_chart()

        #This has the right behaviour but only selects the last index
        for x in range(len(self.indexes)):
            self.ui.room_chart.setCurrentIndex(self.indexes[x])
        self.ui.room_chart.setFocus()

    def build_chart(self):
        self.ui.room_chart.setRowCount(0)
        self.ui.room_chart.setColumnCount(0) 
        col_labels = []
        for x in range(8):
            current_day = datetime.now() + timedelta(days=x)
            col_labels.append(current_day.strftime('%a') + '\n' + current_day.strftime('%d/%m/%y'))
            self.ui.room_chart.setColumnCount(len(col_labels))
            self.ui.room_chart.setHorizontalHeaderLabels(col_labels)

        row_labels = []
        for x in range(8):
            row_labels.append(str(x))
            self.ui.room_chart.setRowCount(len(row_labels))
            self.ui.room_chart.setVerticalHeaderLabels(row_labels)
        self.button = QPushButton(self.ui.room_chart)
        self.button.setText("Push me")
        self.ui.room_chart.setCellWidget(0 , 0, self.button)


if __name__=="__main__":
    app=QApplication(sys.argv)
    myapp = Guest_form()
    myapp.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 27 апреля 2018

Вы должны использовать select() метод QItemSelectionModel:

def book(self):
    persistenIndex = map(QPersistentModelIndex, self.ui.room_chart.selectedIndexes())

    #Do stuff
    self.build_chart()

    for pix in persistenIndex:
        ix = QModelIndex(pix)
        self.ui.room_chart.selectionModel().select(ix, QItemSelectionModel.Select)

    self.ui.room_chart.setFocus()

Примечание: Преобразует QModelIndex в QPersistentModelIndex, чтобы избежать проблем, поскольку неизвестно, удаляет ли build_chart(), перемещает или выполняет какие-либо другие действия, которые изменяют положение товар.

...