繁体   English   中英

QList复制构造函数:如何新建QList <QStandardItem *> 可变的

[英]QList copy constructor:how to new a QList<QStandardItem *> with variable

我得到了一个QList<QString> ,它读取QString变量并将其存储到这样的列表中:

QList<QString> itemlist;

现在,我想从该QString列表中创建一个QList<QStandardItem *> ,我尝试这样做:

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

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

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

这就是我在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被删除了), QStandardItem的copy-ctor也没有公开。

或者,您可以使用std::unique_ptr<QList<std::shared_ptr<QStandardItem>>并获取std::unique_ptr<QList<std::shared_ptr<QStandardItem>>的完全托管列表,但是您必须将拥有每个项目的std::shared_ptr所有权转让给您正在使用的Qt模型。

在Linux / g ++-4.9上测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM