2016-07-28 24 views
1

我想讓listview和tableview一起工作。如何爲列表視圖設置數據源以包含自定義數據? (並與QTableView關聯)

listview必須用於顯示,tableview必須用於編輯數據。 tableview是在彈出窗口小部件中按需創建的(並且可能永遠不需要)。

我從一個文本文件中填充列表視圖 - 每行一行,兩個條目由一個製表符分隔。簡單。

的實現代碼如下必須單獨編輯2列......此外,在列表視圖中點擊,我必須能夠檢索分的第一部分...

我創建的QStringListModel模型子類。

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); 

其中

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顯示正確,其他顯示空字符串。

看來,QStringListModel是不能存儲任何東西,除了EditRole

所以我剩下2個選項 - 要麼對每個選擇進行拆分,還要創建表視圖,或者 - 我想嘗試但不知道如何 - 創建一個QStandardItemModel,它可以充當列表視圖和表格視圖的數據源,並且可以輕鬆地檢索點擊時需要的部分數據。

我以爲我可以簡單地使用它來設置列表視圖上的數據(就像他們做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))); 

但是,這將只設置在ListView的第一個字符串,我真的很需要兩個,我仍然不知道如何檢索數據

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

或者...
在裝載部分,嘗試:

if(!temp.isEmpty()) 
    { 
     QStringList splist = temp.split('\t'); 
     splist.append(QString()); // so I don't need to test 
     QStandardItem *item = new QStandardItem(temp); 
     m_myList->setItem(r, 0, item); 
     QModelIndex idx = m_myList->index(r, 0); 
     QMap<int, QVariant> roles; 
     roles.insert(Qt::UserRole + 1, QVariant(splist.at(0))); 
     roles.insert(Qt::UserRole + 2, QVariant(splist.at(1))); 
     roles.insert(Qt::DisplayRole, QVariant(temp)); 
     m_myList->setItemData(idx, roles); 
     ++r; 
    } 

這工作 - 顯示細膩並得到上單擊正確的內容 - 但似乎是不可用的實現代碼如下。
(好像我正在做兩次工作,與setItemsetItemData - 如此技術上存儲內容3倍)。

我怎樣才能讓我的listview有一個帶有2個字符串項目的數據源,同時顯示,能夠在tableview上設置它,並能夠在點擊時檢索第一個項目?

回答

0

我想出一個辦法來共享ListView和的tableview之間的數據源:

創建3列 - 列0與組合的組件,且將列1和2與分離的部件。

的列表視圖將只顯示列0。對於tableview中,我會隱藏列0

我需要用於處理的數據將被存儲在列1和2。用戶在tableview中編輯數據將要求在接受更改時編輯相應的列0.

相關問題