如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

qt怎么把char[转为vector

Qt/QML:std::vector<int> 处理

SWIG 如何正确包装 std::vector<double *>

std::vector<MyClass*> 的 VBO 和正确的步幅

如何使 std::vector 的 operator[] 编译在 DEBUG 中而不是在 RELEASE 中进行边界检查

正确分配 std::vector