2015-01-05 19 views
-2

파이썬에서 QAbstractListModel에 관한 문제가 있습니다. 내 모델을 만들려고합니다. 문제는 뷰가 내 값 목록을 표시하지 않는다는 것입니다.PySide : QListView와 함께 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_()); 

이 스크립트를 실행 한 후에는 목록보기에서 anytithng가 표시되지 않습니다.

+1

복사/붙여 넣기 오류가 발생했습니다. 모델 클래스가 표시되지 않았습니다. – ekhumoro

+0

조언을 주셔서 감사합니다. 나는 그 – crn

+0

당신의 코드가 _minimal_ 예에서 멀리 떨어져 있다고 고친다. – buhtz

답변

1

보기에 아무것도 표시되지 않는 이유는 모델의 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] 

(처리되지 않은 역할의 PySide는 Qt는 문서에 따라, 널 QVariantNone 변환됩니다).