Wstawienie wykresu w okno w pliku .ui.

0

Witam,
stworzyłem w QT Creatorze interesujące mnie okno, ale chciałbym dodać w nie wykres opart o jakieś dane.
Znalazłem coś co może mi się przydać:
https://doc.qt.io/qt-5/qtcharts-qmloscilloscope-example.html
Tylko jest to w pliku qml a nie ui.
Wyznaczyłem sobie obszar Widget, ale nie wiem jak mam tam dodać obszar wykresu.
Dodatkowo znalazłem coś takiego:
http://doc.qt.io/qt-5/qtuitools-multipleinheritance-example.html

Utworzyłem funkcje w moim mainwindow:

private slots:
void on_widget_drawDataOnScreen();

Mam następujący kod do wyświetlania wykresu danych:

void MainWindow::on_widget_drawDataOnScreen()
{
        QLineSeries *series0 = new QLineSeries();
        QLineSeries *series1 = new QLineSeries();

        *series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6)
                 << QPointF(16, 7) << QPointF(18, 5);
        *series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3)
                 << QPointF(16, 4) << QPointF(18, 3);

        QAreaSeries *series = new QAreaSeries(series0, series1);
        series->setName("Batman");
        QPen pen(0x059605);
        pen.setWidth(3);
        series->setPen(pen);

        QLinearGradient gradient(QPointF(0, 0), QPointF(0, 1));
        gradient.setColorAt(0.0, 0x3cc63c);
        gradient.setColorAt(1.0, 0x26f626);
        gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
        series->setBrush(gradient);

        QChart *chart = new QChart();
        chart->addSeries(series);
        chart->setTitle("Simple areachart example");
        chart->createDefaultAxes();
        chart->axisX()->setRange(0, 20);
        chart->axisY()->setRange(0, 10);

        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
}

Ale jak go dodać do konkretnego wigetu?

2

QChart to jest QGraphicsWidget czyli ma być używane wewnątrz QGraphicsView albo QChartView.
Czyli do UI dodajesz QGraphicsView, następnie ustawiasz na nim QGraphicsScene i dodajesz do tego swój chart.
Albo do UI dodajesz QChartView i dodajesz do tego swój chart.

0

A mógłbyś mi wytłumaczyć jak to się robi? Bo nie wiem jak mogę połączyć to co zrobiłem w kreatorze okna(to co jest zapisane w pliku mainwindow.ui) z kodem w mainwindow.cpp W kreatorze dodałem Graphics View i ten obiekt nazywa się graphicsView. Teraz mam stworzyć w moim pliku obiekt QGraphicsView i nazwać go tak samo, tylko odwołać się do tego elementu z okna?

0

Udało mi się coś napisać. Dodaje QChart do graphicsViev, ale zamiast wykresu pojawia mi się niebieski kwadracik i dookoła niego kropki. Co robię źle?

window::window(QWidget *parent):QMainWindow(parent), ui(new Ui::window)
{
    ui->setupUi(this);
    //this -> setStyleSheet("background-color: Darkslateblue");

    scene = new QGraphicsScene(this);
    ui->graphicsViewAScan->setScene(scene);

    m_chart = new QChart;
    m_chart->setMaximumSize(450, 450);
    m_chart->setTitle("window");
    m_chart->legend()->hide();

    QLineSeries *series = new QLineSeries;
    for(int i=0; i<10; i++)
        for(int j = 10; j>0; j--)
            series->append(i,j);
    m_chart->addSeries(series);

    m_chart->createDefaultAxes();
    m_chart->setAcceptHoverEvents(true);

    scene->addItem(m_chart);
}

window.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QDialog>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QAreaSeries>
#include <QtCharts/QChart>

QT_CHARTS_USE_NAMESPACE

namespace Ui
{
    class window;
}

class window : public QMainWindow
{
    Q_OBJECT

public:
    explicit window(QWidget *parent = 0);
    ~window();

private slots:
    void drawDataOnScreen();

private:
    Ui::window *ui;
    QGraphicsScene *scene;
    QChart *m_chart;
};

#endif // WINDOW_H

3

Ok miałem chwilę i krok po kroku.

  1. Wstawiasz w UI Designed QGraphicsView (jest dostępny w pasku z lewej)
  2. lewy przycisk myszy na QGraphicsView "Promoted Widgets…"
  3. W sekcji "New Promoted class" wpisujesz dokładnie coś takiego (domyślne auto uzupełnienie "Header file:" nie pasuje do tego przypadku):
    screenshot-20180809221840.png
  4. nie zapomnij zaznaczyć checkbox "Global include" na dole
  5. Naciśnij "Add", na górze na liście powinien się pojawić wpis jak na screenshot
  6. Naciśnij "Promote", dialog się zamknąć

Na koniec wpisujesz do MainWindow.cpp np coś takiego:

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

    QLineSeries *series0 = new QLineSeries();
    QLineSeries *series1 = new QLineSeries();

    *series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6)
                 << QPointF(16, 7) << QPointF(18, 5);
    *series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3)
                 << QPointF(16, 4) << QPointF(18, 3);

    QAreaSeries *series = new QAreaSeries(series0, series1);
    series->setName("Batman");
    QPen pen(0x059605);
    pen.setWidth(3);
    series->setPen(pen);

    QLinearGradient gradient(QPointF(0, 0), QPointF(0, 1));
    gradient.setColorAt(0.0, 0x3cc63c);
    gradient.setColorAt(1.0, 0x26f626);
    gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
    series->setBrush(gradient);


    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->setTitle("Simple areachart example");
    chart->createDefaultAxes();
    chart->axisX()->setRange(0, 20);
    chart->axisY()->setRange(0, 10);

    ui->graphicsView->setChart(chart);
}

Zerżnięte z przykładu z dokumentacji

I tyle wystarczy. Wynik wygląda tak:
screenshot-20180809222340.png

Bardziej łopatologicznie się nie da.

0

A to tak zrobiłem tylko bez Global include.
Wielkie dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1