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