PySide:将QAbstractListModel与QListView一起使用

时间:2015-01-05 02:22:00

标签: python pyside qlistview qabstracttablemodel

我在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_());

运行此脚本后,我在列表视图中看不到任何内容。

1 个答案:

答案 0 :(得分:1)

视图未显示任何内容的原因是因为模型的data()方法返回了不兼容的值。

data方法必须返回many different roles的数据,并且为所有这些方法返回相同的值没有意义。特别是,您的实现返回SizeHintRole的字符串,最终将被解释为QSize(0, 0)。这是因为,在内部,PySide必须在将值传递给Qt之前将其转换为QVariantQVariant可以表示许多不同的数据类型,但类型之间的转换并不总是可行的 - 因此对于这些情况,将返回无效的默认值。

您的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