qt qwt QwtPlotCurves 的 QList

Posted

技术标签:

【中文标题】qt qwt QwtPlotCurves 的 QList【英文标题】:qt qwt QList of QwtPlotCurves 【发布时间】:2012-05-10 10:44:33 【问题描述】:

我想制作一个 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 指出的“隐式共享”,以摆脱“新”运算符。

【问题讨论】:

您在堆栈上声明 QList,但在堆上分配它... 这是我见过的 SO 标题中 Q 最多的。 【参考方案1】:

你有两个问题:

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

    QList<T> = *QList<T>
    

    顺便说一句:您很少需要将newQList 分开,因为Qt 为它的所有容器类实现了隐式共享 - 简而言之,您如果其他地方需要包含的数据,可以自信地将所有 Qt 容器(和plenty of other classes besides)声明为堆栈对象和按值传递 - Qt 将处理所有内存效率和对象清理。

    阅读this了解更多信息。

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

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

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

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

【讨论】:

请查看我修改后的问题。 您对错误的理解是完全正确的 - 我已经稍微修改了我的答案;-)

以上是关于qt qwt QwtPlotCurves 的 QList的主要内容,如果未能解决你的问题,请参考以下文章

Qt & QWT:QwtPlotCurve - 曲线未显示

无法在 Qt 中链接 qwt

QT开发(十七)——QWT简介

如何在 Qt 4.7 中使用 Qwt

使用 qt creator 安装 qwt

在 linux ubuntu 上的 Qt 5 中运行 qwt 示例