我在python中遇到了QAbstractListModel的问题。我正在尝试创建自己的模型。问题是视图不显示我的值列表。
from PySide.QtCore import *
import PySide.QtCore
from PySide.QtGui import *
from PySide import QtCore, QtGui
import sys
class ModelPoc(QAbstractListModel):
m_items=[];
def __init__(self,parent = None):
QtCore.QAbstractListModel.__init__(self, parent)
def initialize (self,mlist):
self.m_items = mlist;
def rowCount(self, parent = QModelIndex()):
return len(self.m_items)
def setData(self, index, value, role = Qt.EditRole):
if role == Qt.EditRole:
self.m_items[ index.row() ] = str(value.toString());
self.dataChanged.emit(index, index);
return True
return False
def data(self, index, role = Qt.DisplayRole):
ret = "test";
if role == QtCore.Qt.DisplayRole:
ret= str( self.m_items[index.row()] );
print (ret);
return ret;
def flags(self, index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
class Main(QtGui.QMainWindow, ui_test.Ui_MainWindow):
m_pocModel = poc_model.ModelPoc();
def __init__(self,parent=None):
super(Main,self).__init__(parent);
self.ui = ui_test.Ui_MainWindow();
self.ui.setupUi(self);
self.ui.pushButton.clicked.connect(self.clickedMyButton);
self.init();
def init(self):
self.ui.listView.setModel(self.m_pocModel);
Main.m_pocModel.initialize(["test", "tes1t", "t3est", "t5est", "t3est"]);
self.ui.listView.show();
@Slot()
def clickedMyButton(self):
text = self.ui.lineEdit.text();
self.ui.label.setText( text );
app = QtGui.QApplication(sys.argv);
test = Main();
test.show();
sys.exit(app.exec_());
运行此脚本后,我在列表视图中看不到任何内容。
答案 0 :(得分:1)
视图未显示任何内容的原因是因为模型的data()
方法返回了不兼容的值。
data方法必须返回many different roles的数据,并且为所有这些方法返回相同的值没有意义。特别是,您的实现返回SizeHintRole
的字符串,最终将被解释为QSize(0, 0)
。这是因为,在内部,PySide必须在将值传递给Qt之前将其转换为QVariant
。 QVariant可以表示许多不同的数据类型,但类型之间的转换并不总是可行的 - 因此对于这些情况,将返回无效的默认值。
您的data
方法实现应该更像这样:
def data(self, index, role=QtCore.Qt.DisplayRole):
if role == QtCore.Qt.DisplayRole:
row = index.row()
if 0 <= row < self.rowCount():
return self.m_items[row]
(对于未处理的角色,根据Qt文档,PySide会将None
转换为null QVariant
。