QList复制构造函数:如何用变量</qstandarditem>创建一个QList <qstandarditem * =“”>

时间:2014-08-24 10:05:28

标签: c++ qt qt4

我得到一个QList<QString>,可以将QString个变量读入并存储到这样的列表中:

QList<QString> itemlist;

现在我想从QList<QStandardItem *>列表中创建一个QString,我试过了:

QList<QStandardItem *> *items = new QList<QStandardItem *>(itemlist);

编译器(vs2010)提供的错误消息无法从“QList<T>”转换为“const QList<T> &

有人可以告诉我该怎么做吗?

1 个答案:

答案 0 :(得分:1)

这就是我在 C ++ 11 中编写强力转换函数的方法。它需要一个const-ref QList<QString>并将std::unique_ptr返回QList<QStandardItem*>

#include <QtCore/QList>
#include <QtGui/QStandardItem>

using ItemList = QList<QStandardItem*>;

std::unique_ptr<ItemList> toItemList(const QList<QString>& strings)
{
  std::unique_ptr<ItemList> items(new ItemList);

  for(auto& str : strings)
  {
    items->push_back(new QStandardItem(str));
  }

  return items;
}

示例:

QList<QString> strings;
strings.push_back("Hello");
strings.push_back("QStandardItem");

auto items = toItemList(strings);

for (auto item : *items.get())
{
  std::cout << item->text().toStdString() << std::endl;
}

<强>输出:

Hello
QStandardItem

请注意:虽然列表本身由std::unique_ptr管理,但值不会以任何方式管理,即您必须自己管理所有QStandardItem的已分配内存。但是,知道Qt,我怀疑你会在一些管理释放的模型中使用这些项目。

在其他情况下,我使用了

  • std::unique_ptr<QList<std::unique_ptr<QStandardItem>>或只是
  • QList<QStandardItem>

QList(在我可用的版本中)都不是移动感知的,并且不能使用值类型std::unique_ptr<T>(因为它的copy-ctor被删除),也不是{{1复制公开。

作为替代方案,您可以使用QStandardItem并获取完整托管的QStandardItem列表,但您必须将所有权从std::unique_ptr<QList<std::shared_ptr<QStandardItem>>保留每个项目转移到您正在使用的Qt模型

在Linux / g ++上测试 - 4.9