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

标签 python pyqt pyqt5 qlistview qstandarditemmodel

我正在使用以下代码创建 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()

最佳答案

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

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

另一方面,如果您想选择继承自 QAbstractItemView 的 View 元素如本例所示QListView您必须使用QItemSelectionModel与使用方法 selectionModel() 获取的 View 关联。 QItemSelectionModel有多种方法可以以不同的方式选择和取消选择,在这种情况下,您必须使用方法 select 并传递标志 QItemSelectionModel::Select 。另一方面,默认情况下, View 可以选择单个元素,如果您想要选择更多元素,则必须使用 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_())

关于python - 使用 QStandardItemModel 获取 QListView 中选定的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52040538/

相关文章:

python - PyQt5 导入 QtGui 失败

python - SPSS - 添加输出中的因子载荷作为数据变量

python - 如何解决由于 python 问题而导致 "apt-get install"不起作用的问题

python - ValueError : Cannot assign "' assignee '": "Task. 受让人”必须是一个 "User"实例

python - Pylint 中模块 'QApplication' 错误中无名称 'PyQt5.QtWidgets'

python - 如何在没有可见空白的情况下扩展/缩小 QTable View

python - 无法使用 jenkins 运行 python 脚本

python - 如何在 QTextEdit 小部件的顶部插入文本?

python - 是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?

python - 使用 pyside 中的 QWizard 下一个插槽