2017-01-06 6 views
1

누구도 QTableView에 수직 및 수평 헤더를 추가하는 방법을 알고 있습니까? 나는 지금 몇 시간 동안이 작업을 해왔다. 그리고 나는 그것을 알아낼 수 없다. (-하지만, 난 당신이 아이디어를 얻을 희망 미안 해요, 난 Excel에서했다) : 현재 결과 : 그러나 enter image description herePYQT : 수평 및 수직 헤더

, 나는이를 생산하기 위해 노력하고 있습니다.

from PyQt4 import QtCore, QtGui, uic 
import sys 
try: 
    from PyQt4.QtCore import QString 
except ImportError: 
    QString = str 

SYSTEM=0 

class inovaTableModel(QtCore.QAbstractTableModel): 
    def __init__(self, data = [[]], headers=[], parent=None): 
     QtCore.QAbstractTableModel.__init__(self, parent) 
     self.__data = data 
     self.__headers = headers 

    def rowCount(self, parent): 
     return len(self.__data) 

    def columnCount(self, parent): 
     return len(self.__data[0]) 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable 

    def data(self, index, role): 

     if role == QtCore.Qt.EditRole: 
      row = index.row() 
      column = index.column() 
      return self.__data[row][column] 

     if role == QtCore.Qt.ToolTipRole: 
      row = index.row() 
      column = index.column() 
      return self.__data[row][column] 

     if role == QtCore.Qt.DisplayRole: 
      row = index.row() 
      column = index.column() 
      return self.__data[row][column] 


    def setData(self, index, value, role = QtCore.Qt.EditRole): 
     if role ==QtCore.Qt.EditRole: 

      row = index.row() 
      column = index.column() 
      self.dataChanged.emit(index, index) 
      return self.__data[row][column] 

    def headerData(self, section, orientation, role): 
     if role == QtCore.Qt.DisplayRole: 

      if orientation == QtCore.Qt.Horizontal: 
       return QString("X","Y","Z") 
      if orientation == QtCore.Qt.Vertical: 
       return QString("List ") + QString(section) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    app.setStyle("plastique") 

    data = ["one", "two", "three",] 
    tableData_alpha = [ 
       ["5","1"], 
       ["10", "3"], 
       ] 


    headers = ["Y", "X", "Z"] 
    model = inovaTableModel(tableData_alpha) 

    tableView = QtGui.QTableView() 
    tableView.show() 
    tableView.setModel(model) 

    sys.exit(app.exec_()) 

내가 모델 클래스에 headerData 추가 : enter image description here

여기 내 코드입니다. 수직 헤더를 작동시킬 수는 있지만 수평은 사용할 수 없습니다.

enter image description here

답변

2

당신이 특정 섹션의 헤더를 반환해야하므로 헤더 데이터는, 열/행 당입니다 오히려 모든 3보다 str("X", "Y", "Z"), 당신이 필요로하는 str의 유효 사용되지 않습니다 : 다음은 결과입니다 section의 값으로 식별 된 값만 반환하십시오.

def headerData(self, section, orientation, role): 
    if role == QtCore.Qt.DisplayRole: 
     if orientation == QtCore.Qt.Horizontal: 
      return ["X", "Y", "Z"][section] 
     if orientation == QtCore.Qt.Vertical: 
      return QString("List ") + QString(section) 
+0

감사합니다. 나는 모델 - 뷰 프로그래밍을 사용하고있다. 또한, 내 코드는 원래 게시물에 게시됩니다. 모델 클래스에서 setHeaderData를 사용해 보았습니다. 그러나 작동하지 않습니다. –

+0

원본 코드를 편집했습니다. Vertical Headers를 사용할 수 있었지만 Horizontal Headers에는 여전히 문제가 있습니다. –

+0

아, 답변이 업데이트되었습니다. 'setHeaderData'는 사용자에 의한 헤더 편집을 지원합니다. – Schollii