Python 具有索引恢复的QListView
作为对我上一篇文章的另一个问题的延伸。在Python 具有索引恢复的QListView,python,python-3.x,pyqt,pyqt5,qlistview,Python,Python 3.x,Pyqt,Pyqt5,Qlistview,作为对我上一篇文章的另一个问题的延伸。在QListView中保存和恢复所选项目的QListView。还原后所选项目的索引无法正确打印 使用currentchange-slot方法更改索引,它将在QListView中打印所选项目的正确索引。但在重新运行软件并恢复值后,按确定按钮而不更改任何项目,当前索引应与所选项目相对应,但在这种情况下只打印0? 它缺少什么 导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类小部件(QtWidgets.QDialog): def uuu
QListView
中保存和恢复所选项目的QListView
。还原后所选项目的索引无法正确打印
使用currentchange-slot
方法更改索引,它将在QListView
中打印所选项目的正确索引。但在重新运行软件并恢复值后,按确定按钮
而不更改任何项目,当前索引应与所选项目相对应,但在这种情况下只打印0
?
它缺少什么
导入系统
从PyQt5导入QtCore、QtGui、QtWidgets
类小部件(QtWidgets.QDialog):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setFont(QtGui.QFont(“Helvetica”,8,QtGui.QFont.Normal,斜体=False))
self.setWindowTitle(“获取所选项目”)
lay=qtwidts.QVBoxLayout(self)
self.button=qtwidts.QPushButton(“好”)
self.button.clicked.connect(self.accept)
self.listView=qtwidts.QListView()
放置内容边缘(10,10,10,10)
lay.addWidget(self.listView)
self.entry=QtGui.QStandardItemModel()
self.listView.setModel(self.entry)
self.listView.setspace(4)
self.listView.setFont(
QtGui.QFont(“Helvetica”,9,QtGui.QFont.Normal,斜体=False)
)
self.listView.setUniformItemSizes(True)
self.listView.setFixedSize(300150)
Code_Group=qtwidts.QGroupBox()
代码组.setTitle(&选择和取消选择)
代码组设置布局(布局)
Vlay=qtwidts.QVBoxLayout(self)
Vlay.addWidget(代码组)
addWidget(self.button,alignment=QtCore.Qt.AlignCenter)
Vlay.setSizeConstraint(Vlay.SetFixedSize)
self.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint,True)
self.read_设置()
self.listView.selectionModel().currentChanged.connect(self.on\u row\u changed)
self.accepted.connect(self.write\u设置)
行上的def已更改(自身、当前、以前):
self.\u INDEX=current.row()
打印('第%d行选择了'%current.Row())
def关闭事件(自身、事件):
打印(“关闭事件”)
self.write_设置()
超级(小部件,自我)。关闭事件(事件)
def read_设置(自身):
设置=QtCore.QSettings(“file.ini”,QtCore.QSettings.ini格式)
settings.beginGroup(“listView”)
model=self.listView.model()
如果设置。包含(“项目”):
editTriggers=settings.value(
“editTriggers”,类型=qtwidts.QAbstractItemView.editTriggers
)
selectionMode=settings.value(
“selectionMode”,type=qtwidts.QAbstractItemView.selectionMode
)
selectionBehavior=settings.value(
“selectionBehavior”,type=qtwidts.QAbstractItemView.selectionBehavior
)
self.listView.setEditTriggers(editTriggers)
self.listView.setSelectionMode(selectionMode)
self.listView.setSelectionBehavior(selectionBehavior)
items=settings.value(“items”,type=QtCore.QByteArray)
stream=QtCore.QDataStream(items,QtCore.QIODevice.ReadOnly)
而不是stream.atEnd():
it=QtGui.QStandardItem()
流>>它
model.appendRow(it)
selecteditems=settings.value(“selecteditems”,type=list)
对于selecteditems中的行:
索引=模型索引(第0行)
self.listView.selectionModel().select(
索引,QtCore.QItemSelectionModel.Select
)
其他:
中的文本[
“项目名称1”,
“项目名称2”,
“项目名称3”,
“项目名称4”,
“项目名称5”,
]:
it=QtGui.QStandardItem(文本)
model.appendRow(it)
self.listView.setEditTriggers(
qtwidts.qabstractemview.NoEditTriggers
)
self.listView.setSelectionMode(
qtwidts.qabstractemview.SingleSelection
)
self.listView.setSelectionBehavior(
qtwidts.qabstractemview.SelectRows
)
settings.endGroup()
def写入_设置(自身):
设置=QtCore.QSettings(“file.ini”,QtCore.QSettings.ini格式)
settings.beginGroup(“listView”)
model=self.listView.model()
settings.setValue(“editTriggers”,self.listView.editTriggers())
settings.setValue(“selectionMode”,self.listView.selectionMode())
settings.setValue(“selectionBehavior”,self.listView.selectionBehavior())
items=QtCore.QByteArray()
stream=QtCore.QDataStream(items,QtCore.QIODevice.WriteOnly)
对于范围内的i(model.rowCount()):
it=型号。项目(i)
stream您正在监视currentIndex,希望选择一个索引也会修改currentIndex,但这是不正确的。如果要还原currentIndex,则还必须保存并还原它 导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类小部件(QtWidgets.QDialog): def uuu init uuu(self,parent=None): 超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级) self.setFont(QtGui.QFont(“Helvetica”,8,QtGui.QFont.Normal,斜体=False)) self.setWindowTitle(“获取所选项目”) lay=qtwidts.QVBoxLayout(self) self.button=qtwidts.QPushButton(“好”) self.button.clicked.connect(self.accept) self.listView=qtwidts.QListView() 放置内容边缘(10,10,10,10) lay.addWidget(self.listView) self.entry=QtGui.QStandardItemModel() self.listView.setModel(self.entr
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.setFont(QtGui.QFont("Helvetica", 8, QtGui.QFont.Normal, italic=False))
self.setWindowTitle("Getting selected item")
lay = QtWidgets.QVBoxLayout(self)
self.button = QtWidgets.QPushButton("Okay")
self.button.clicked.connect(self.accept)
self.listView = QtWidgets.QListView()
lay.setContentsMargins(10, 10, 10, 10)
lay.addWidget(self.listView)
self.entry = QtGui.QStandardItemModel()
self.listView.setModel(self.entry)
self.listView.setSpacing(4)
self.listView.setFont(
QtGui.QFont("Helvetica", 9, QtGui.QFont.Normal, italic=False)
)
self.listView.setUniformItemSizes(True)
self.listView.setFixedSize(300, 150)
Code_Group = QtWidgets.QGroupBox()
Code_Group.setTitle("&Selecting and deselecting")
Code_Group.setLayout(lay)
Vlay = QtWidgets.QVBoxLayout(self)
Vlay.addWidget(Code_Group)
Vlay.addWidget(self.button, alignment=QtCore.Qt.AlignCenter)
Vlay.setSizeConstraint(Vlay.SetFixedSize)
self.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint, True)
self.read_settings()
self.listView.selectionModel().currentChanged.connect(self.on_row_changed)
self.accepted.connect(self.write_settings)
def on_row_changed(self, current, previous):
self._INDEX = current.row()
print('Row %d selected' % current.row())
def closeEvent(self, event):
print("closeEvent")
self.write_settings()
super(Widget, self).closeEvent(event)
def read_settings(self):
settings = QtCore.QSettings("file.ini", QtCore.QSettings.IniFormat)
settings.beginGroup("listView")
model = self.listView.model()
if settings.contains("items"):
editTriggers = settings.value(
"editTriggers", type=QtWidgets.QAbstractItemView.EditTriggers
)
selectionMode = settings.value(
"selectionMode", type=QtWidgets.QAbstractItemView.SelectionMode
)
selectionBehavior = settings.value(
"selectionBehavior", type=QtWidgets.QAbstractItemView.SelectionBehavior
)
self.listView.setEditTriggers(editTriggers)
self.listView.setSelectionMode(selectionMode)
self.listView.setSelectionBehavior(selectionBehavior)
items = settings.value("items", type=QtCore.QByteArray)
stream = QtCore.QDataStream(items, QtCore.QIODevice.ReadOnly)
while not stream.atEnd():
it = QtGui.QStandardItem()
stream >> it
model.appendRow(it)
selecteditems = settings.value("selecteditems", type=list)
for row in selecteditems:
index = model.index(row, 0)
self.listView.selectionModel().select(
index, QtCore.QItemSelectionModel.Select
)
else:
for text in [
"Itemname1",
"Itemname2",
"Itemname3",
"Itemname4",
"Itemname5",
]:
it = QtGui.QStandardItem(text)
model.appendRow(it)
self.listView.setEditTriggers(
QtWidgets.QAbstractItemView.NoEditTriggers
)
self.listView.setSelectionMode(
QtWidgets.QAbstractItemView.SingleSelection
)
self.listView.setSelectionBehavior(
QtWidgets.QAbstractItemView.SelectRows
)
settings.endGroup()
def write_settings(self):
settings = QtCore.QSettings("file.ini", QtCore.QSettings.IniFormat)
settings.beginGroup("listView")
model = self.listView.model()
settings.setValue("editTriggers", self.listView.editTriggers())
settings.setValue("selectionMode", self.listView.selectionMode())
settings.setValue("selectionBehavior", self.listView.selectionBehavior())
items = QtCore.QByteArray()
stream = QtCore.QDataStream(items, QtCore.QIODevice.WriteOnly)
for i in range(model.rowCount()):
it = model.item(i)
stream << it
settings.setValue("items", items)
selecteditems = []
for index in self.listView.selectionModel().selectedRows():
selecteditems.append(index.row())
settings.setValue("selecteditems", selecteditems)
settings.endGroup()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())