2016-07-28 2 views
1

listview와 tableview를 함께 사용하려고합니다.목록보기에서 사용자 지정 데이터를 포함하도록 데이터 원본을 설정하는 방법은 무엇입니까? (그리고 QTableView와 연관)

목록보기를 사용하여 표시해야하며 데이터 편집에는 tableview를 사용해야합니다. Tableview는 팝업 위젯에서 필요에 따라 생성되며 필요 없을 수도 있습니다.

처음에는 텍스트 파일에서 listview를 채 웁니다. 각 행에는 탭으로 구분 된 2 개의 항목이 있습니다. 쉬운.

의 tableview 내가 QStringListModel의 모델 서브 클래스를 생성 한

... 또한, 목록보기를 클릭에, 내가 분할의 첫 번째 부분을 검색 할 수 있어야합니다 ... 별도로 2 열을 편집해야합니다.

class StringList : public QStringListModel 
{ 
public: 
    void append (const QString& string) 
    { 
     insertRows(rowCount(), 1); 
     QModelIndex m = index(rowCount() - 1); 
     setData(m, string, Qt::EditRole); 
     QStringList splist = string.split('\t'); 
     setData(m, splist.at(0), Qt::ToolTipRole); 
     if(splist.size() > 1) 
      setData(m, splist.at(1), Qt::StatusTipRole); 
     else 
      setData(m, "", Qt::StatusTipRole); 

     qDebug() << data(m, Qt::EditRole).toString() 
       << data(m, Qt::ToolTipRole).toString() 
       << data(m, Qt::StatusTipRole).toString(); 
    } 
}; 

EditRole 표시가 제대로, 나머지는 빈 문자열을 표시

QListView *m_myView = new QListView(); 
StringList *m_myList = new StringList(); 
QTextStream in(&myFile); 
while (!in.atEnd()) 
{ 
    QString temp = in.readLine(); 
    if(!temp.isEmpty()) 
     m_myList->append(temp); 
} 
myFile.close(); 
m_myView->setModel(m_myList); 

.

QStringListModelEditRole을 제외한 모든 것을 저장할 수없는 것으로 보입니다.

그래서 두 가지 옵션이 남았습니다. 각 선택에서 분할을 수행하고 테이블보기를 만들 때 또는 - 시도하고 싶은 것이 있지만 어떻게 알지는 못합니다 - 다음과 같이 작동 할 수있는 QStandardItemModel을 만듭니다. listview와 tableview에 대한 데이터 소스를 제공하며 클릭시 필요한 부분 데이터를 쉽게 검색 할 수 있습니다.

나는 단순히 목록보기 (예 : here)에서 데이터를 설정하는 데 사용할 수 있다고 생각했습니다.

QListView *m_myView = new QListView(); 
QStandardItemModel *m_myList = new QStandardItemModel(); 
QTextStream in(&myFile); 
int r = 0; 
while (!in.atEnd()) 
{ 
    QString temp = in.readLine(); 
    if(!temp.isEmpty()) 
    { 
     QStringList splist = temp.split('\t'); // assume I know there will be 2 strings always 
     QStandardItem *item = new QStandardItem(splist.at(0)); 
     m_myList->setItem(r, 0, item); 
     QStandardItem *item1 = new QStandardItem(splist.at(1)); 
     m_myList->setItem(r, 1, item1); 
     ++r; 
    } 
} 
myFile.close(); 
m_myView->setModel(m_myList); 

connect(m_myListView, SIGNAL(clicked(QModelIndex)), 
     this, SLOT(listChangedSlot(QModelIndex))); 

하지만 이것은 단지 목록보기의 첫 번째 문자열을 설정합니다 ...
을에서 정말 모두 필요하고, 난 여전히 데이터

void listChangedSlot(QModelIndex index) 
{ 
    qDebug() << m_myList->item(index.row(), 0)->data().toString() 
      << m_myList->item(index.row(), 1)->data().toString(); 
} // shows empty strings 

또는를 검색하는 방법을 모른다 로드 섹션에서 시도 :

이 작동합니다 - 잘 표시하고 클릭시 올바른 콘텐츠를 가져옵니다 -하지만 tableview 사용할 수없는 것 같습니다.
(그리고 나는 setItemsetItemData으로 두 번 일하고있는 것 같습니다. 그래서 기술적으로 내용을 3 번 저장합니다).

목록보기에 2 개의 문자열 항목이있는 데이터 소스가 있고 둘 다 표시하고 테이블 뷰에서 설정할 수 있으며 클릭시 첫 번째 항목을 검색 할 수 있습니까? 결합 성분과 컬럼 0 및 컬럼 분리 된 성분 1 및 2 -

I 3 열을 생성 :

답변

0

는 I리스트 뷰와의 tableview 간의 데이터 소스를 공유하는 방법을 알아 냈다.

리스트 뷰는 I 열을 0

I 처리에 필요한 데이터는 컬럼 1 및 2에 저장된다를 숨기는 것 tableview에 대해서만 열에 0을 표시 할 것이다.사용자가 tableview에서 데이터를 편집하려면 변경 사항을 수락하면 해당 열 0의 편집이 필요합니다.

관련 문제