如何为列表视图设置数据源以包含自定义数据? (并与 QTableView 关联)
How to set data source for a list view to contain custom data ? (and associate with QTableView)
我正在尝试让列表视图和 table视图协同工作。
列表视图必须用于显示,table视图必须用于编辑数据。 table视图是在弹出窗口小部件中按需创建的(可能永远不需要)。
我在开始时从文本文件填充列表视图 - 每行一行,2 个条目由制表符分隔。简单。
table视图必须分别编辑 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 个选择 - 要么在每个选择上进行拆分,也可以在创建 table 视图时进行拆分,或者 - 我想尝试但不知道如何 - 创建一个QStandardItemModel
可以作为列表视图和 table 视图的数据源,并且可以轻松检索我在单击时需要的部分数据。
我想我可以简单地用它来设置列表视图上的数据(就像他们做的那样 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
或者...
在加载部分,尝试:
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;
}
这有效 - 显示正常并在点击时获得正确的内容 - 但似乎无法用于 table 视图。
(似乎我做了两倍的工作,setItem
和 setItemData
- 所以技术上存储内容 3 次)。
我怎样才能让我的列表视图有一个包含 2 个字符串项目的数据源,同时显示这两个项目,能够在 table 视图上设置它,并能够在点击时检索第一个项目?
我想出了一个在 listview 和 tableview 之间共享数据源的方法:
我创建了 3 列 - 第 0 列包含合并的组件,第 1 列和第 2 列包含分离的组件。
列表视图将仅显示第 0 列。对于表视图,我将隐藏第 0 列。
我需要处理的数据将存储在第 1 列和第 2 列中。用户在 tableview 中编辑数据将需要在接受更改后编辑相应的第 0 列。
我正在尝试让列表视图和 table视图协同工作。
列表视图必须用于显示,table视图必须用于编辑数据。 table视图是在弹出窗口小部件中按需创建的(可能永远不需要)。
我在开始时从文本文件填充列表视图 - 每行一行,2 个条目由制表符分隔。简单。
table视图必须分别编辑 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 个选择 - 要么在每个选择上进行拆分,也可以在创建 table 视图时进行拆分,或者 - 我想尝试但不知道如何 - 创建一个QStandardItemModel
可以作为列表视图和 table 视图的数据源,并且可以轻松检索我在单击时需要的部分数据。
我想我可以简单地用它来设置列表视图上的数据(就像他们做的那样 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
或者...
在加载部分,尝试:
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;
}
这有效 - 显示正常并在点击时获得正确的内容 - 但似乎无法用于 table 视图。
(似乎我做了两倍的工作,setItem
和 setItemData
- 所以技术上存储内容 3 次)。
我怎样才能让我的列表视图有一个包含 2 个字符串项目的数据源,同时显示这两个项目,能够在 table 视图上设置它,并能够在点击时检索第一个项目?
我想出了一个在 listview 和 tableview 之间共享数据源的方法:
我创建了 3 列 - 第 0 列包含合并的组件,第 1 列和第 2 列包含分离的组件。
列表视图将仅显示第 0 列。对于表视图,我将隐藏第 0 列。
我需要处理的数据将存储在第 1 列和第 2 列中。用户在 tableview 中编辑数据将需要在接受更改后编辑相应的第 0 列。