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

问题描述 投票:1回答:2

我正在使用此代码创建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中的项目设置为选中状态?setSelected()对于QStandardItemModel似乎不存在

python pyqt pyqt5 qlistview qstandarditemmodel
2个回答
2
投票

QStandardItemModel是一个模型,因此您可以将QAbstractItemModel的所有方法都用作rowCount(),它告诉我们行数,因此您可以对它们进行迭代并使用item()方法来获得QStandarItem关联每个索引,然后使用text()QStandarItem方法获取文本。

l = [self.entry.item(i).text() for i in range(self.entry.rowCount())]
print(l)

另一方面,如果要选择从QAbstractItemView继承的视图元素,在这种情况下QListView,则必须使用与将通过QItemSelectionModel方法获得的视图关联的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_())

如果只想选择一个项目,则必须使用setCurrentIndex(),因为它在内部调用了select()selectionModel()方法。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from random import randint


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)

        item = self.entry.item(randint(0, self.entry.rowCount()-1))
        self.listView.setCurrentIndex(self.entry.indexFromItem(item))

    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
投票

尝试:

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

© www.soinside.com 2019 - 2024. All rights reserved.