如何在 QT 中正确显示 std::vector?
Posted
技术标签:
【中文标题】如何在 QT 中正确显示 std::vector?【英文标题】:How to show std::vector in QT properly? 【发布时间】:2016-12-14 20:40:40 【问题描述】:我有小类“字典”,其中包含 std::vector 中的所有数据。我想在 QT 应用程序中显示这些数据。所以我做了一个小的研究,我发现我应该像这样使用 ListView:
ui->WordList->setModel(new QStringListModel(QList<QString>::fromVector
(dict->getQVector())));
但这看起来真的很表演。每次向向量添加新元素时,我都必须更新 ListView 的模型。而且我还必须在我的 Dictionary 类中添加函数来获取 QVector:
QVector<QString> getQVector()
QVector<QString> qv;
for (size_t i = 0; i < container.size(); i++)
qv.push_back(QString::fromStdString((std::string)container[i]));
return qv;
...这看起来也很慢。 所以我有一个问题:我应该使用 QTL 重写我的 Dictionary 类吗?如果是这样,如何以方便的方式使用 ListView (或其他东西)显示 QVector ? 提前致谢。
【问题讨论】:
***.com/questions/32084336/… 您可以编写一个自定义的 QAbstractListModel 子类,直接返回 std::vector 的数据 【参考方案1】:在不知道您对 Dictionary 类的所有要求的情况下,我的建议是将内部 std::vector 替换为 QStringListModel,然后将其设置为您的视图模型。当您对 QStringListModel 进行更改时,它将自动反映在您的视图中。
或者,通过从 QAbstractItemModel 子类化您的 Dictionary 类使其成为模型。您仍然可以将 std::vector 保留为内部数据结构,然后您的“data”和“setData”方法将读取和写入 std::vector。
如果不了解您的字典的用途、是否已排序、是否包含重复条目等等,很难就适当的数据结构提出可靠的建议。
【讨论】:
以上是关于如何在 QT 中正确显示 std::vector?的主要内容,如果未能解决你的问题,请参考以下文章
SWIG 如何正确包装 std::vector<double *>
std::vector<MyClass*> 的 VBO 和正确的步幅
如何使 std::vector 的 operator[] 编译在 DEBUG 中而不是在 RELEASE 中进行边界检查