如何为列表视图设置数据源以包含自定义数据? (并与QTableView关联)

问题描述:

我想让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上设置它,并能够在点击时检索第一个项目?

我想出一个办法来共享ListView和的tableview之间的数据源:

创建3列 - 列0与组合的组件,且将列1和2与分离的部件。

的列表视图将只显示列0。对于tableview中,我会隐藏列0

我需要用于处理的数据将被存储在列1和2。用户在tableview中编辑数据将要求在接受更改时编辑相应的列0.