【问题标题】:PySide: Using QAbstractListModel with QListViewPySide:将 QAbstractListModel 与 QListView 一起使用
【发布时间】:2017-07-27 19:24:57
【问题描述】:

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

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

【问题讨论】:

  • 似乎存在复制/粘贴错误:您尚未显示模型类。
  • 感谢您的建议。我解决了这个问题
  • 您的代码与 minimal 示例相差甚远。

标签: python pyside qlistview qabstracttablemodel


【解决方案1】:

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

data 方法必须为many different roles 返回数据,并且为所有它们返回相同的值是没有意义的。特别是,您的实现为SizeHintRole 返回一个字符串,最终将被解释为QSize(0, 0)。这是因为,在内部,PySide 必须先将值转换为 QVariant,然后再将其传递给 Qt。 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 转换为空的QVariant)。

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多