2017-10-27 2 views
0

안녕하세요,QML TableView from

파일에서 tableview를 만드는 데 몇 가지 문제가 있습니다.

는 기본적으로 난 그냥 CSV 파일을로드 할 수있는 버튼이 있고 나는

나는 나의 주된 문제는 내가 열 동적 번호를 가지고 있다고 생각 ... QML있는 TableView이 파일의을 보여주고 싶어요.

TableView 
{ 
    id: tableView 

    enabled:    dynVars.csvVarTableModel.b_csvEnabled 
    frameVisible:   false 
    sortIndicatorVisible: false 

    model:     dynVars.csvVarTableModel 

    resources: 
    { 
     var roleList = dynVars.csvVarTableModel.roleStringList 
     var temp = [] 
     for(var i=0; i<roleList.length; i++) 
     { 
      var role = roleList[i] 
      temp.push(columnComponent.createObject(tableView, { "role": role, "title": role}))} 
      return temp 
     } 
    }  
} 

columnComponent 내가 QAbstractTableModel과 협력 단순한 TableViewColumn ... 입니다. 그리고 난 지금까지 모든 기본적인 물건을했을 난 다음 funtions를 재 구현 :

public: 
     int   rowCount (const QModelIndex &parent = QModelIndex()) const; 
     int   columnCount (const QModelIndex &parent = QModelIndex()) const; 
     // QVariant headerData(int section, Qt::Orientation orientation, int role) const; 
     QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; 
    private: 
     QHash<int, QByteArray> roleNames() const; 

는 내가 모든 열을위한 역할을하도록 roleNames 함수를 오버로드했습니다. 즉 내가 문서 ... 데이터

QHash<int,QByteArray> CSVVarTableModel::roleNames() const 
{ 
    QHash<int, QByteArray> roles = QAbstractTableModel::roleNames(); 
    for(int i = 0; i < m_v_headers.size();i++) 
     roles[i + Qt::UserRole] = m_v_headers.at(i).toLatin1(); 
    return roles; 
} 

() 나는 단순히 m_vv_table.at(index.row()).at(role); 역할이 UserRoles 중 하나 인 경우 을 반환을 .... 이해 방법

이 처음 CSV 파일 I을 위해 잘 작동 테이블에로드 ... 그 후에, anotherfile을로드하려고 할 때 roleNames가 QML에서 업데이트되지 않는 것 같습니다. 이미 문제를 해결하기 위해 여러 가지 조합을 시도했습니다 ... 그 순간에도 좋은 코드 예제가 없기 때문에 그 이유가 있습니다. 모두가 약간 섞여서 ...

완전히 잘못된 방식으로 나는 간단한 파일을로드하는 것이 너무 복잡하다는 것을 상상할 수 없다. 나를 미치게 만든다.

누군가가 힌트 또는 작은 예제를 제공한다면, 동적으로 파일을로드하는 방법은 정말 멋질 것이다. colums의 양.

종류와 관련,

모에

+0

'QAbstractTableView'가 없으므로'QAbstractTableModel'을 의미하는 것 같군요? 'QAbstractItemModel :: roleNames()'는 변경되어서는 안되며, 단지 QAbstractItemModel :: headerData를 구현해야한다는 점에서 테이블 뷰와 함께 표시되는 실제 열 헤더가 아니라 표시 역할을 반환합니다. "헤더 데이터"에 대한 자세한 정보는 설명서를 확인하십시오. – xander

+0

안녕하세요, 고마워요 네가 네 말이 맞다. QAbstractTableModel을 의미한다. mhh 이미 시도했지만, 그걸 기억하면 headerData가 호출되지 않았다. 나는 그 시도를 할 것이다. 내가 뭔가를 간과 했음 – mBucks

+0

QML TableView가 그것을 사용하는지 잘 모르겠지만, 일반적으로 그렇게해야합니다. 열 머리글 이름을 제공하는 올바른 방법이기 때문입니다. 단순한'QAbstractTableModel'만으로'TableView' 만 테스트하고 그것들이 어떻게 작동하는지 보는 작은 새 프로젝트를 만들 수 있습니다. 슬프게도 Qt dev 환경 atm에 대한 액세스 권한이 없습니다. – xander

답변

1

은 동적 모델 변경 이벤트에 열을 추가 할 수 있습니다. 내 프로젝트에서

예 :

  onModelChanged: { 
      for(var index = tableView.columnCount-1; index>=0; index--) { 
       tableView.removeColumn(index) 
      } 
      for(var i = 0; i< model.columnCount(); i++) { 
       tableView.addColumn(columnComponent.createObject(
        {                   
         "title":model.headerData(i, 1).toString(),                  
         "role":model.headerData(i, 1).toString(),                   
         "delegate": textDelegate, 
         "movable": false 
        }) 
       ) 
      } 

     } 

C를 사용하는 방법에 대한 다른 모든 정보 ++ QML의 모델은 Qt는 문서에 있습니다.