0

我想制作一个 QwtPlotCurve 的 QList 。这样做的原因是以后能够从我的 QwtPlot 中删除它们。我有以下代码:

QList<QwtPlotCurve> myList = new QList<QwtPlotCurve>;
QwtPlotCurve* curve1 = new QwtPlotCurve();
QwtPlotCurve* curve2 = new QwtPlotCurve();
curves->append(curve1);
curves->append(curve2);

代码无法编译,编译器输出:

错误:请求从“QList”转换为非标量类型“QList”

错误:没有匹配函数调用'QList::append(QwtPlotCurve &)' void QList::append(const T&) [with T = QwtPlotCurve]

注:候选人是:

注意: void QList::append(const T&) [with T = QwtPlotCurve]

注意:没有已知的参数 1 从 'QwtPlotCurve*' 到 'const QwtPlotCurve&' 的转换

注意: void QList::append(const QList&) [with T = QwtPlotCurve]

注意:没有已知的参数 1 从 'QwtPlotCurve*' 到 'const QList&' 的转换

...

我说 QwtPlotCurve 应该是恒定的,但我不知道如何处理它。我也不知道将曲线存储在 QList 中然后(根据用户需求)从图中删除是否是正确的方法。


在 sjwarner 回答之后,我尝试了以下方法:

QList<QwtPlotCurve*> curves;
QwtPlotCurve* curve1 = new QwtPlotCurve();
QwtPlotCurve* curve2 = new QwtPlotCurve();
curves->append(curve1);
curves->append(curve2);

我收到以下错误:

错误:“->”的基本操作数具有非指针类型“QList”错误:“->”的基本操作数具有非指针类型“QList”

我通过以下方式理解了这个错误:曲线是一个 QList,它应该是一个指向 QList 的指针。

如果我尝试:

QList<QwtPlotCurve*>* curves = new QList<QwtPlotCurve*>;
QwtPlotCurve* curve1 = new QwtPlotCurve();
QwtPlotCurve* curve2 = new QwtPlotCurve();
curves->append(curve1);
curves->append(curve2);

它工作正常。我将看看 sjwarner 指出的“隐式共享”以摆脱“新”运算符。

4

1 回答 1

1

你有两个问题:

  1. 正如上面 Kamil Klimlek 所评论的那样,您QList在堆栈上声明您的对象,然后尝试在堆上分配它 - 因为new返回一个指向您正在使用的对象类型的指针new,所以您实际上是在尝试执行以下操作:

    QList<T> = *QList<T>
    

    顺便说一句:您需要new关闭 a是非常罕见的QList,因为 Qt为其所有容器类实现了隐式共享- 简而言之,您可以自信地将所有 Qt 容器(以及除 之外的许多其他类)声明为堆栈如果在其他地方需要包含的数据,则对象和按值传递 - Qt 将处理所有内存效率和对象清理。

    阅读内容以获取更多信息。

  2. 您正在声明一个QList对象并尝试用指向对象的指针填充它。您需要决定是否要QList包含数据副本:

    QList<QwtPlotCurve> curves;
    QwtPlotCurve curve1();
    QwtPlotCurve curve2();
    curves.append(curve1);
    curves.append(curve2);
    

    或者您是否想QwtPlotCurve在堆上分配您的 s 并将指向它们的指针存储在QList

    QList<QwtPlotCurve*> curves;
    QwtPlotCurve* curve1 = new QwtPlotCurve();
    QwtPlotCurve* curve2 = new QwtPlotCurve();
    curves.append(curve1);
    curves.append(curve2);
    
于 2012-05-10T14:05:51.400 回答