Russian Qt Forum
Март 28, 2024, 17:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QChart  (Прочитано 16195 раз)
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« : Март 14, 2017, 17:13 »

Хочу реализовать простую программу (график ось х время, ось У числа). Есть виджет с кнопкой и ввод числа. Хочу при нажатии на кнопку, чтобы число в dublespinbox добавилась на ось У а на ось Ч время.
 
Код:
#include "chart.h"
#include "ui_chart.h"

chart::chart(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::chart)
{
    ui->setupUi(this);

    //qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));

    series = new QLineSeries();
    series->append(momentInTime.toMSecsSinceEpoch(),0);
    m_chart = new QChart();
    m_chart->addSeries(series);
    m_chart->legend()->hide();
    m_chart->setTitle("Sunspots count (by Space Weather Prediction Center)");
    //![3]

    //![4]
    axisX = new QDateTimeAxis;
    axisX->setTickCount(10);
    //axisX->setFormat("MMM yyyy");
    axisX->setTitleText("Date");
    m_chart->addAxis(axisX, Qt::AlignBottom);
    series->attachAxis(axisX);

    axisY = new QValueAxis;
    axisY->setLabelFormat("%i");
    axisY->setTitleText("Sunspots count");
    m_chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisY);
    //![4]

    //![5]
    chartView = new QChartView(m_chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    ui->gridLayout->addWidget(chartView);

}

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

void chart::on_pushButton_clicked()
{
    m_chart->removeSeries(series);
    series->append(momentInTime.toMSecsSinceEpoch(), ui->doubleSpinBox->value());
    m_chart->addSeries(series);
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 14, 2017, 21:15 »

Ты спросить что-то хотел или так, поделиться?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #2 : Март 15, 2017, 07:46 »

Конечно спросить  Подмигивающий мой код не работает. Как это реализовать ? Если я использую не врямя по оси X  а точки то все получается с времененм ничего не получается
Записан
VPS
Гость
« Ответ #3 : Март 15, 2017, 11:58 »

Можно попробовать расширять диапазон по осям, например так:
Код:
void MainWindow::on_pushButton_clicked()
{
   QDateTime minX = axisX->min();
   QDateTime maxX = axisX->max();

   qreal minY = axisY->min();
   qreal maxY = axisY->max();

   QDateTime x = QDateTime::currentDateTime();
   qreal y = ui->doubleSpinBox->value();

   axisX->setRange(minX, x > maxX ? x : maxX);
   axisY->setRange(minY, y > maxY ? y : maxY);
   series->append(x.toMSecsSinceEpoch(), y);
}

Если же диапазон максимальных и минимальных значений по осям не будет изменяться, то можно использовать сигнально-слотовое соединение в конструкторе:
Код:
connect(series, SIGNAL(pointAdded(int)), chartView, SLOT(update()));
« Последнее редактирование: Март 15, 2017, 13:16 от vps » Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #4 : Март 15, 2017, 16:49 »

спасибо получилось без сигналов. Я думал он автоматом масштабирует. Дрогой вопрос допустим я хочу только 10 точек отобразить на графике, то есть при добавлении 11 первая удаляется и все сдвигаются тем самым на графике только 10 последних значений. Чтобы это реализовать нужно все вручную делать? перезаписывать QPoin  или же можно функцией scroll воспользоваться. Будет ли утечка памяти ?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #5 : Март 15, 2017, 17:17 »

Будет ли утечка памяти?

Я пробовал двигать с помощью axisX->setRange(), правда не знаю, насколько это правильно. И после нескольких таких "движений" вывод графика начинает дико тормозить. А QChart, похоже, и без посторонней помощи течёт: QCharts Memory Leak Улыбающийся.
Записан

Пока сам не сделаешь...
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #6 : Март 16, 2017, 13:42 »

Движение как показано в примере нужно осуществлять функцией scroll (QChart ) как я понял.   
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Март 16, 2017, 14:24 »

Да, с помощью QChart::scroll() тоже двигается график. Но отжирание памяти и тормоза так же накапливаются как и при axisX->setRange(). Даже при пустой координатной сетке, без отображения данных.
Записан

Пока сам не сделаешь...
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #8 : Март 16, 2017, 17:18 »

Ты не решил проблему с утечкой памяти? Наверное оно возникает при добавление в QLineSerias записей. МОжет попробовать replace Qpoint делать ?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #9 : Март 16, 2017, 21:12 »

В пользовательском коде нечему течь. Или я чего-то не знаю Улыбающийся.

Код
C++ (Qt)
#include <QApplication>
#include <QMainWindow>
#include <QChartView>
#include <QChart>
#include <QLineSeries>
#include <QValueAxis>
#include <QDateTimeAxis>
#include <QDateTime>
#include <QGraphicsSceneMouseEvent>
 
using namespace QtCharts;
 
const int SecsInHour = 3600;
 
class MyChart : public QChart
{
protected:
   void mousePressEvent(QGraphicsSceneMouseEvent *event) override
   { event->accept(); }
   void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
   {
       if (event->buttons().testFlag( Qt::LeftButton) )
       {
           #if 1
           scroll(event->lastPos().x() - event->pos().x(), 0);
           #else
           qint64 secs = SecsInHour / 2;
           if (event->pos().x() > event->lastPos().x())
               secs = -secs;
           QDateTimeAxis * axis_x = qobject_cast<QDateTimeAxis *>(axisX());
           QDateTime current = axis_x->min();
           current = current.addSecs( secs );
           axis_x->setRange(current, current.addDays(1));
           #endif
       }
   }
};
 
int main(int argc, char *argv[])
{
   QApplication application(argc, argv);
 
   QDateTime current(QDate::currentDate(), QTime());
 
   QLineSeries *series = new QLineSeries;
   series->append(current.addSecs(SecsInHour * 1 ).toMSecsSinceEpoch() , 25);
   series->append(current.addSecs(SecsInHour * 2 ).toMSecsSinceEpoch() , 75);
   series->append(current.addSecs(SecsInHour * 3 ).toMSecsSinceEpoch() , 25);
 
   QDateTimeAxis *axisX = new QDateTimeAxis();
   axisX->setRange(current, current.addDays(1));
   axisX->setTickCount(12);
   axisX->setFormat("dd.MM hh:00");
 
   QValueAxis *axisY = new QValueAxis();
   axisY->setRange(0, 100);
 
   MyChart *chart = new MyChart();
   chart->legend()->hide();
   chart->addSeries(series);
   chart->setAxisX(axisX, series);
   chart->setAxisY(axisY, series);
 
   QChartView *chart_view = new QChartView(chart);
 
   QMainWindow main_window;
   main_window.setCentralWidget(chart_view);
   main_window.resize(1000, 600);
   main_window.show();
 
   return application.exec();
}
 

Если после запуска приложения быстро елозить мышкой график влево-вправо, то секунд через 20-30 будут заметны подтормаживания, а через минуту и того хлеще. Это особенно заметно, если рядом запустить свежий экземпляр приложения и там график подвигать. Ну и в какой-нить утилите по мониторингу приложений видно, что память отжирается и не освобождается.
Записан

Пока сам не сделаешь...
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #10 : Март 16, 2017, 21:32 »

я собираю 100 точек на графике с интервалом 5 сек. После того как добавятся все 100 точек на график я начинаю сдвигать график, то есть всегда на графике последнее 100 точек. Так вот, я в диспетчере задач смотрю память она растет и растет не знаю что делать  Непонимающий.
Записан
VPS
Гость
« Ответ #11 : Март 16, 2017, 21:40 »

я собираю 100 точек на графике с интервалом 5 сек. После того как добавятся все 100 точек на график я начинаю сдвигать график, то есть всегда на графике последнее 100 точек. Так вот, я в диспетчере задач смотрю память она растет и растет не знаю что делать  Непонимающий.
Вы при этом удаляете точки, которые не отображаются на графике из QLineSeries?
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #12 : Март 16, 2017, 21:51 »

Цитировать
Вы при этом удаляете точки, которые не отображаются на графике из QLineSeries?
нет не удаляю. Про скройлинге они не удаляются ?
Записан
VPS
Гость
« Ответ #13 : Март 16, 2017, 22:07 »

Цитировать
Вы при этом удаляете точки, которые не отображаются на графике из QLineSeries?
нет не удаляю. Про скройлинге они не удаляются ?
Думаю, что нет. Да и в описании к методу про это ничего не сказано.
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #14 : Март 16, 2017, 22:46 »

посмотрите пример Dynamic Spline Example, там вроде ничего не удаляется 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.