PyQt5使用QStandardItemModel获取QListView中的选定索引

时间:2018-08-27 13:29:31

标签: python pyqt5

我正在使用以下代码创建QListView和QStandardItemModel:

self.listView = QtWidgets.QListView(self.groupBox2)
self.listView.setGeometry(QtCore.QRect(200, 20, 400, 220))
self.entry = QtGui.QStandardItemModel()

我正在使用类似以下内容的循环添加项目:

self.item1 = QtGui.QStandardItem("Itemname1")
self.entry.appendRow(self.item1)
self.item2 = QtGui.QStandardItem("Itemname2")
self.entry.appendRow(self.item2)

我如何将这些项目分配给列表,知道列表中的0代表“ Itemname1”,1代表“ Itemname2”等?

此外,我如何将QListView中的项目设置为选中状态? QStandardItemModel似乎不存在setSelected()

2 个答案:

答案 0 :(得分:0)

尝试一下:

import sys
from PyQt5       import QtWidgets, QtGui, QtCore
from PyQt5.QtGui import QBrush, QColor 

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        lay = QtWidgets.QVBoxLayout(self)

        self.listView = QtWidgets.QListView()
        self.label    = QtWidgets.QLabel("Please Select item in the QListView")
        lay.addWidget(self.listView)
        lay.addWidget(self.label)

        self.entry = QtGui.QStandardItemModel()
        self.listView.setModel(self.entry)

        self.listView.clicked[QtCore.QModelIndex].connect(self.on_clicked)
        # When you receive the signal, you call QtGui.QStandardItemModel.itemFromIndex() 
        # on the given model index to get a pointer to the item        

        for text in ["Itemname1", "Itemname2", "Itemname3", "Itemname4"]:
            it = QtGui.QStandardItem(text)
            self.entry.appendRow(it)
        self.itemOld = QtGui.QStandardItem("text")

    def on_clicked(self, index):
        item = self.entry.itemFromIndex(index)
        self.label.setText("on_clicked: itemIndex=`{}`, itemText=`{}`"
                           "".format(item.index().row(), item.text()))
        item.setForeground(QBrush(QColor(255, 0, 0))) 
        self.itemOld.setForeground(QBrush(QColor(0, 0, 0))) 
        self.itemOld = item

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

enter image description here

答案 1 :(得分:0)

QStandardItemModel是一个模型,因此您可以将QAbstractItemModel的所有方法用作rowCount()来告诉我们行数,因此可以遍历它们并使用{{1} }方法获得与每个索引关联的item(),然后使用QStandarItem的{​​{1}}方法获取文本。

text()

另一方面,如果要选择从QStandarItem继承的视图元素,例如l = [self.entry.item(i).text() for i in range(self.entry.rowCount())] print(l) ,则必须使用与该视图关联的QAbstractItemView使用方法QListView获得。 QItemSelectionModel有几种以不同方式选择和取消选择的方法,在这种情况下,您必须使用select方法并传递标志selectionModel()。另一方面,默认情况下,视图已启用以选择单个元素,如果要选择更多元素,则必须使用QItemSelectionModel方法并将其传递标志QItemSelectionModel::Select

示例:

setSelectionMode()

如果只想选择一个项目,则必须使用QAbstractItemView::MultiSelection,因为它在内部调用import sys from PyQt5 import QtCore, QtGui, QtWidgets class Widget(QtWidgets.QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) lay = QtWidgets.QVBoxLayout(self) button = QtWidgets.QPushButton("to list") button.clicked.connect(self.modelToList) self.listView = QtWidgets.QListView() lay.addWidget(button) lay.addWidget(self.listView) self.entry = QtGui.QStandardItemModel() self.listView.setModel(self.entry) for text in ("Itemname1", "Itemname2", "Itemname3", "Itemname4"): it = QtGui.QStandardItem(text) self.entry.appendRow(it) self.listView.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) sm = self.listView.selectionModel() for item in (self.entry.item(1), self.entry.item(2)): index = self.entry.indexFromItem(item) sm.select(index, QtCore.QItemSelectionModel.Select) def modelToList(self): l = [self.entry.item(i).text() for i in range(self.entry.rowCount())] print(l) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) w = Widget() w.show() sys.exit(app.exec_()) 的{​​{1}}方法。

setCurrentIndex()