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

时间:2016-07-28 14:12:55

标签: qt listview qlistview qmodelindex

我想让listview和tableview一起工作。

必须使用listview进行显示,必须使用tableview来编辑数据。 tableview是在弹出窗口小部件中按需创建的(可能永远不需要)。

我在开始时从文本文件填充列表视图 - 每行一行,其中两个条目由制表符分隔。容易。

tableview必须分别编辑2列...同样,在listview上单击,我必须能够检索分割的第一部分......

我创建了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个选项 - 要么在每个选择上进行拆分,要么在创建表格视图时,或者 - 我想尝试但不知道如何 - 创建{{1} }可以作为列表视图和表视图的数据源,并且可以轻松检索单击所需的部分数据。

我以为我可以简单地用它来设置listview上的数据(就像它们here一样)。

QStandardItemModel

但是这只会在listview中设置第一个字符串,我真的需要两个,而且我还不知道如何检索数据

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 (似乎我正在做两次工作, 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; } setItem - 所以技术上将内容存储3次。

如何让listview拥有一个包含2个字符串项的数据源,同时显示两者,能够在tableview上设置它,并能够在点击时检索第一个项目吗?

1 个答案:

答案 0 :(得分:0)

我想出了一种在listview和tableview之间共享数据源的方法:

我创建了3列 - 第0列包含组合的组件,第1列和第2列包含分隔的组件。

列表视图将仅显示第0列。对于tableview,我将隐藏第0列。

我需要处理的数据将存储在第1列和第2列中。在接受更改后,用户编辑tableview中的数据将需要编辑相应的第0列。