如何从索引列表中选择 QtableWidget 中的单元格

Posted

技术标签:

【中文标题】如何从索引列表中选择 QtableWidget 中的单元格【英文标题】:How to select cells in QtableWidget from list of indexes 【发布时间】:2018-04-27 17:50:47 【问题描述】:

在 QtableWidget 中,我想在查询数据库时存储选定的单元格并将先前选定的单元格返回到被选中状态。我刷新 QtableWidget 上的项目会清除选择。用户可以选择不连续的单元格范围。

在使用 QtableWidget.selectedIndexes() 刷新数据之前,我可以毫无问题地获取选定的单元格。

我尝试循环遍历索引列表并使用 setCurrentIndex ,但这只会留下最后一个索引。我已经没有想法了。如何根据存储的索引恢复选定的单元格范围?

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】:

你必须使用QItemSelectionModelselect()方法:

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() 是否删除、移动或执行任何其他改变位置的操作项目。

【讨论】:

谢谢!我必须做一些谷歌搜索才能理解地图功能,但这是一个写得很好且很有帮助的答案。 你能解释一下为什么 map 会保留这些值,但如果我只是 .append(QPersistentModelIndex(QModelIndex)) 到一个列表并稍后尝试使用它,它不会保留它的值吗? 另外,self.ui.room_chart.setFocus() 似乎不起作用。 @Dkellygb persistenIndex = map(QPersistentModelIndex, self.ui.room_chart.selectedIndexes()) 等价于persistenIndex = [QPersistentModelIndex(ix) for ix in self.ui.room_chart.selectedIndexes()]

以上是关于如何从索引列表中选择 QtableWidget 中的单元格的主要内容,如果未能解决你的问题,请参考以下文章

获取从 QTableWidget 中的单元格小部件发出的信号发送器的行索引

如何取消选择整个 QTableWidget 行

如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中? (QComboBox 有复选框来选择项目)

如何使用 itextsharp 从 PDF 的列表框中检索用户选择的索引?

如何在 QTableWidget 中获取单元格的索引?

如何使用 LINQ 从列表中选择提供的索引范围内的值