Создать новый объект из ссылки указателя C ++ - PullRequest
0 голосов
/ 15 марта 2019

Итак, у меня есть этот код ниже:

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

И я изменю объекты серии в этом цикле, и я не хочу изменять исходный объект, а создам новый отредактированный. Я чрезвычайно новичок в C ++ и Qt, поэтому я хочу что-то вроде кода Java ниже:

QLineSeries editedSeries = new QLineSeries(series);

Кстати, я удаляю элементы, редактирую и переупорядочиваю их из серий. Но, как я уже сказал, они нужны мне обоим.

EDIT:

Я попробовал ваши ответы, но, по-моему, лучше всего написать код. Это проект, сделанный неким сотрудником, который сменил работу, поэтому это не мой код, как я сказал, я не знаю 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 голосов
/ 15 марта 2019

Глядя на определение класса QLineSeries, я не вижу простого способа скопировать ваш экземпляр для его дублирования. Таким образом, вам придется сначала создать новый экземпляр: QLineSeries editedSeries; и вручную скопируйте в него содержимое вашей оригинальной серии. editedSeries.append(originalSeries.points()); Поскольку вы не можете изменить данные, если они находятся в объекте QLineSeries, я бы порекомендовал создать подкласс QLineSeries или изменить QList<QPointF>, полученный с помощью originalSeries.points(), перед добавлением его в новый график.

0 голосов
/ 15 марта 2019

QLineSeries не копируется, поэтому вы не можете делать то, что хотите, изменив копию. Вам нужно будет создать новый QLineSeries с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...