G
5 мая 2024 г. 1:13

добавить qlineseries в функции

qlineseries

Всем доброго времени суток!
Товарищи, помогите, юному падавану обуздать QChart, уже неделю пытаюсь сам решить проблему, в интернете подходящих статей не нашел:)

Проблема в следующем:
Хочу иметь собственный, пользовательский класс для создания графиков QChart. Идея заключается в том, чтобы в класс через функцию, можно было добавлять данные, а они уже автоматически будут строиться
мой код

профайлер
QT += core gui charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

!!!DEFINES += QT_DEPRECATED_WARNINGS

You can make your code fail to compile if it uses deprecated APIs.

In order to do so, uncomment the following line.

DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
GrarhPlotter.cpp \
callout.cpp \
main.cpp \
mainwindow.cpp

HEADERS += \
GraphPlotter.h \
callout.h \
mainwindow.h

FORMS += \
mainwindow.ui

Default rules for deployment.

qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mainwindow.h

ifndef MAINWINDOW_H

define MAINWINDOW_H

include

include

include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
};

endif // MAINWINDOW_H

mainwindow.cpp

include "mainwindow.h"

include "ui_mainwindow.h"

include "GraphPlotter.h"

//#include

MainWindow::MainWindow(QWidget parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// GPlotter gplotter(ui->view);
GPlotter
gplotter = new GPlotter(ui->view);

  1. QVector<double> arr1{6, 7, 8, 9, 10};
  2. QVector<double> arr2{5, 4, 3, 2, 1};

// int idOne = gplotter.addSeries("plot1", arr1);
int idOne = gplotter->addSeries("plot1", arr1);
// int idOne = gplotter->addSeries("plot1", arr1);
// int idTwo = gplotter.addSeries("plot2", arr2);

// QLineSeries oneSeries = gplotter.takeSeries(idOne);
// QLineSeries
twoSeries = gplotter.takeSeries(idTwo);

// oneSeries->append(QPointF(5, 100));
// twoSeries->insert(0, QPointF(1, 50));
// gplotter.update();
}

MainWindow::~MainWindow()
{
delete ui;
}

мой пользовательский класс: GPlotter
GraphPlotter.h

ifndef GRAPHPLOTTER_H

define GRAPHPLOTTER_H

include

include

include

include

include

include

include "callout.h"

//namespace Ui {
//class GPlotter;
//}

//namespace Ui {
//class MainWindow;
//}

QT_CHARTS_USE_NAMESPACE

class GPlotter : public QChartView
{
Q_OBJECT

public:

  1. explicit GPlotter(QWidget *parent = nullptr);
  2. ~GPlotter();
  3.  
  4. int addSeries(QString title, QVector <double> &arr);
  5. QLineSeries* takeSeries(int key);
  6. void setConf(QString param);
  7. void clearChart(QString title);
  8. void update(void);

// QLineSeries series;
QChart
chart;
QString title;
QMap map;

  1. void saveAxisRange();

private:
//Ui::MainWindow *ui;

  1. QPoint m_lastPoint;
  2. bool m_isPress;
  3. bool m_ctrlPress;
  4. bool m_alreadySaveRange;
  5. double m_xMin, m_xMax, m_yMin, m_yMax;
  6. QGraphicsSimpleTextItem* m_coordItem;

protected:
void mousePressEvent(QMouseEvent *event);

public slots:
};

endif // GRAPHPLOTTER_H

GrarhPlotter.cpp

include "GraphPlotter.h"

include

//#include
//#include

include "ui_mainwindow.h"

GPlotter::GPlotter(QWidget *parent) :
QChartView(parent)
//QWidget (view),
//ui(new Ui::MainWindow)
{

  1. chart = new QChart();

// QChartView view = new QChartView(chart);
// QChartView
view = new QChartView(parent);
// view->setParent(parent);
// view->setChart(chart);

// view->setMouseTracking(true);
// setChart(chart);
setMouseTracking(true);
// QLineSeries series = new QLineSeries();
// series = new QLineSeries();
//
series << QPointF(1, 1);
// series << QPointF(2, 2);
//
series << QPointF(3, 3);
// series << QPointF(4, 4);
//
series << QPointF(5, 5);
// chart->addSeries(series);
// chart->createDefaultAxes();
}

int GPlotter::addSeries(QString title, QVector &arr){

  1. QLineSeries *series = new QLineSeries();
  2. series->setName(title);
  3.  
  4. //chart = new QChart();
  5. QValueAxis *axisX = new QValueAxis();
  6. chart->addAxis(axisX, Qt::AlignBottom);
  7.  
  8.  
  9. QValueAxis *axisY = new QValueAxis();
  10. chart->addAxis(axisY, Qt::AlignLeft);

// this->setChart(chart);

  1. for(int i = 0; i < arr.count(); i++)

// series->append(QPointF(i, arr.at(i)));
*series << QPointF(i, arr.at(i));

  1. map.insert(map.count(), series);
  2. //qDebug() << map;
  3. //chart->legend()->hide();
  4. //chart->setTitle(title);
  5.  
  6.  
  7. chart->addSeries(series);
  8. series->attachAxis(axisX);
  9. series->attachAxis(axisY);

// chart->createDefaultAxes();
// series->attachAxis(chart->axisX());
// series->attachAxis(chart->axisY());

  1. setChart(chart);
  2. return map.firstKey();

}

QLineSeries GPlotter::takeSeries(int key){
QLineSeries
ans;
ans = map[key];
return ans;
}

void GPlotter::update(void){

  1. for(int i = 0; i < map.count(); i++){
  2. chart->removeSeries(map[i]);
  3. chart->addSeries(map[i]);
  4. }
  5. chart->createDefaultAxes();

}

void GPlotter::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_lastPoint = event->pos();
m_isPress = true;
}
}

GPlotter::~GPlotter()
{
//chart->removeAllSeries();
//delete chart;
}

На выходе получаю это:

1) Не понимаю почему изображение не "натягивается" на весь chart
2) после chart->createDefaultAxes(); не могу подключить ось series->attachAxis(chart->axisY()) ( для X соответственно тоже самое)

Спасибо за внимание!

4

Вам это нравится? Поделитесь в социальных сетях!

4
BlinCT
  • 5 мая 2024 г. 14:44

Давно я не работал с виджетами и с формами, на мой взгляд уже пережитов, и в управлении не очень удобное это все.
Н оя у вас не увидел в коде где вы QCharts растягиваете на область парента.

    G
    • 7 мая 2024 г. 9:27

    в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент

      NSProject
      • 23 июня 2024 г. 22:48

      А куда собстаенно делся Евгений раз на сайте такой бордак творится?

        Evgenii Legotckoi
        • 25 июня 2024 г. 0:11

        Я тут. Работы оень много. Отправил его в бан.

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь