从指针参考C ++创建一个新对象

时间:2019-03-15 10:39:21

标签: c++ qt

所以,我在下面有这段代码:

 foreach (QLineSeries* series, lineSeriesMap.values())
    {
        // ...
    }

我将在此循环中修改系列对象,并且我不想修改原始对象,而是创建一个新的已编辑对象。我是C ++和Qt的新手,所以我想要下面的Java代码:

QLineSeries editedSeries = new QLineSeries(series);

我正在删除元素,顺便从系列中对其进行编辑和重新排序。但是,正如我所说的,我俩都需要。

编辑:

我已经尝试了您的答案,但是我认为最好的方法就是编写代码。这是由一些换工作的同事制作的项目,所以不是我的代码,因为我说我不了解C ++。

  

chartwidget.h

void fillAreaSeries();
//...
QHash<QString,QLineSeries*> lineSeriesEntersMap;
QHash<QString,QLineSeries*> lineSeriesExitsMap;
  

chartwidget.cpp

void ChartWidget::fillAreaSeries() {
foreach (QLineSeries* seriesEnter, lineSeriesEntersMap.values())
    {
        if (lineSeriesExitsMap.contains(seriesEnter->name())) {
            QLineSeries* seriesExit = lineSeriesExitsMap.value(seriesEnter->name());
            if (!((seriesEnter->points().size() == 1) && (seriesExit->points().size() == 1))) {
                for(int i = seriesEnter->points().size() - 1; i > 0; i--)
                    {
                        if (seriesEnter->points().at(i - 1).y() > seriesEnter->points().at(i).y())
                        {
                            seriesEnter->removePoints(i, 1);
                        }
                    }
                        for (int i = seriesExit->points().size() - 1; i > 0; i--)
                    {
                        if (seriesExit->points().at(i - 1).y() < seriesExit->points().at(i).y())
                        {
                            seriesExit->removePoints(i-1, 1);
                        }
                    }

                    QVector<QPointF> editPoints = seriesExit->pointsVector();
                    std::sort(editPoints.begin(),editPoints.end(), [] (const QPointF & p1, const QPointF & p2)
                    {
                        return p1.y() < p2.y();
                    });
                    seriesExit->replace(editPoints);

                    qDebug() << "__Swap:__";
                    qDebug() << seriesEnter->points().at(0).y();
                    qDebug() << seriesExit->points().at(0).y();
                    qDebug() << seriesEnter->points().at(1).y();
                    qDebug() << seriesExit->points().at(1).y();

                    QAreaSeries* series = new QAreaSeries(seriesEnter, seriesExit);
                    series->setName(seriesEnter->name());


                    series->setOpacity(0.50);
                    series->setPen(Qt::NoPen);
                    series->setPointLabelsFormat(seriesEnter->name().split("-").at(0));
                    areaSeriesMap.insert(series->name(), series);
            }
        }
    }
}

修改3: 因此,QLineSeries包含QPointF列表。我有以下代码:

foreach (QLineSeries* seriesEnter, lineSeriesEntersMap.values())
    {
  QLineSeries* entersToBeEdited = new QLineSeries(chart);
entersToBeEdited->setName(seriesEnter->name());
entersToBeEdited->points().append(seriesEnter->points());
//...

append无效,返回0点。但是我可以设置一个名字。我还尝试通过遍历项目并通过添加它来进行添加

entersToBeEdited->points().push_back(seriesEnter->points().at(i));

仍然没有。我也尝试过<<+=,但是没有运气。

2 个答案:

答案 0 :(得分:0)

QLineSeries是不可复制的,因此您无法通过修改副本来执行所需的操作。您将需要从头开始创建新的QLineSeries

答案 1 :(得分:0)

看着QLineSeries的类定义,我看不到任何简单的方法来复制您的实例以进行复制。 因此,您将必须首先创建一个新实例: QLineSeries editedSeries; 并手动复制其中的原始系列内容。 editedSeries.append(originalSeries.points()); 由于一旦将数据放入QLineSeries对象中就无法对其进行修改,因此我建议先将QLineSeries子类化或修改通过QList<QPointF>获得的originalSeries.points(),然后再将其添加到新图表中