1

我正在尝试让 listview 和 tableview 一起工作。

listview 必须用于显示,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可以作为两者的数据源listview 和 tableview,并且可以轻松地在单击时检索我需要的部分数据。

我想我可以简单地使用它来设置 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)));

但这只会设置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;
    }

这有效 - 显示良好并在点击时获得正确的内容 - 但似乎无法用于 tableview。
(而且似乎我正在做两倍的工作,setItem并且setItemData- 从技术上讲,内容存储了 3 次)。

如何让我的列表视图有一个包含 2 个字符串项的数据源,同时显示两者,能够在 tableview 上设置它,并能够在单击时检索第一个项目?

4

1 回答 1

0

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

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

listview 将只显示第 0 列。对于 tableview,我将隐藏第 0 列。

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

于 2016-07-28T15:01:46.607 回答