A QStandardItem
не может принадлежать 2 моделям, поэтому, если вы хотите переместить его, вы должны сначала удалить его, используя takeRow()
, а затем вставить его в новую модель.Непосредственное выполнение может привести к проблемам, поскольку удаляемая строка изменит rowCount()
, лучше всего сделать наоборот.
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
lay = QtWidgets.QHBoxLayout(self)
avail_modelLV = QtWidgets.QListView()
sel_modelLV = QtWidgets.QListView()
button = QtWidgets.QPushButton("Select")
lay.addWidget(avail_modelLV)
lay.addWidget(button)
lay.addWidget(sel_modelLV)
button.clicked.connect(self.on_clicked)
self.avail_model = QtGui.QStandardItemModel()
self.sel_model = QtGui.QStandardItemModel()
avail_modelLV.setModel(self.avail_model)
sel_modelLV.setModel(self.sel_model)
for text in ["text1", "text2", "text3", "text4"]:
it = QtGui.QStandardItem(text)
it.setCheckable(True)
self.avail_model.appendRow(it)
def on_clicked(self):
self.sel_model.clear()
for row in reversed(range(self.avail_model.rowCount())):
it = self.avail_model.item(row)
if it.checkState() == QtCore.Qt.Checked:
it = self.avail_model.takeRow(row)
self.sel_model.insertRow(0, it)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())