0

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

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

4

1 回答 1

3

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

data方法必须为许多不同的角色返回数据,并且为所有角色返回相同的值是没有意义的。特别是,您的实现为 . 返回一个字符串,该字符串SizeHintRole最终将被解释为QSize(0, 0). 这是因为,在内部,PySide 必须在将值QVariant传递给 Qt 之前将其转换为 a。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]

(对于未处理的角色,PySide 将转换None为 null QVariant,根据 Qt 文档)。

于 2015-01-05T20:28:20.413 回答