Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ новичок + qwt

Автор: _Vitaliy_ 10.12.2009, 18:11

Доброго времени суток уважаемое комьюнити.
Помогите неопытному (надеюсь пока) новичку побороть qwt.
Есть код:

Раскрывающийся текст

#include <QtGui/QStandardItemModel>

#include "obrabotka.h"
#include "mainwindow.h"

#include <qwt_plot.h>
#include <qwt_plot_marker.h>
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_data.h>
#include <qwt_text.h>
#include <qwt_math.h>

#include <qwt_scale_widget.h>
#include <qwt_painter.h>
#include <qwt_plot_canvas.h>

#include <math.h>

obrabotka::obrabotka(QWidget *parent)
        :QDialog(parent)
{

}

obrabotka::~obrabotka()
{
}

void obrabotka::obra()
{

}

void obrabotka::setModel(QStandardItemModel *model)
{
    m_model = model;

        QList<double> x0, x1, x2, x3;
        int Size = m_model->rowCount();
        double X0[Size], X1[Size], X2[Size], X3[Size];


    for (int i = 0; i < m_model->rowCount(); i++) {
                x0.append(m_model->item(i, 0)->text().toDouble());
                x1.append(m_model->item(i, 1)->text().toDouble());
                x2.append(m_model->item(i, 2)->text().toDouble());
              
    }

        for (int i = 0; i < m_model->rowCount(); i++) {
                X0[i] = x0[i];
                X1[i] = x1[i];
                X2[i] = x2[i];
        }

//******* Grafiki *****
    QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this);
    
    // add curves
    QwtPlotCurve *curve1 = new QwtPlotCurve("H ot T");
    curve1->setRenderHint(QwtPlotItem::RenderAntialiased);
    QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2");

        // Axis of plot
        myPlot->setAxisTitle(QwtPlot::xBottom, "Time/seconds");
        myPlot->setAxisTitle(QwtPlot::yLeft, "Height/meters");
      
    curve1->setPen(QPen(Qt::red));
    curve2->setPen(QPen(Qt::blue));

    curve1->setData(X0,X1,Size);
    curve2->setData(X0,X2,Size);

    curve1->attach(myPlot);
    curve2->attach(myPlot);

    // finally, refresh the plot
    myPlot->resize(600, 500);
    myPlot->replot();
//*************
}


Вроде сам график выводить научился, образования хватило... а дальше темный лес.
Необходимо:
1. График должен растягиваться на все окно (окно, в котором он выводится) и при изменении размеров окна он тоже должен изменяться. Вроде нужно было правильно унаследовать: QwtPlot *myPlot = new QwtPlot(tr("Grafiki zavisimosti parametrov ot vremeni"), this) но у меня не получилось. В примере simpleplot это вроде понятно, хотя я могу и ошибаться...
Раскрывающийся текст

int main(int argc, char **argv)
{
    QApplication a(argc, argv);

    Plot plot;
#if QT_VERSION < 0x040000
    a.setMainWidget(&[b]plot)[/b];
#endif
    plot.resize(600,400);
    plot.show();
    return a.exec();
}


а когда несколько окон, как у меня, я честно говоря недопонимаю...

2. Т.к. ось Х в идеале имеет значение в несколько тысяч единиц, то необходим "скролл", примеры смотрел но не понял. Тем более что графиков планируется около 7 то соответственно они должны "скролироваться" все одновременно.
3. Нужно выводить значение на графике при наведении на него мышкой.
4. При необходимости изменять масштаб. Соответственно чтобы графики между собой не плыли и соответствовали между собой по оси Х.

Знаю что хочу слишком много и сразу, но был бы признателен за помощь.

Автор: Litkevich Yuriy 10.12.2009, 19:06

Цитата(_Vitaliy_ @ 10.12.2009, 21:11) *
График должен растягиваться на все окно (окно, в котором он выводится) и при изменении размеров окна он тоже должен изменяться.
это не относится к Qwt, это относится к компоновщикам Qt.

Автор: azure 25.12.2009, 16:31

Цитата(_Vitaliy_ @ 10.12.2009, 17:11) *
2. Т.к. ось Х в идеале имеет значение в несколько тысяч единиц, то необходим "скролл", примеры смотрел но не понял. Тем более что графиков планируется около 7 то соответственно они должны "скролироваться" все одновременно.
3. Нужно выводить значение на графике при наведении на него мышкой.
4. При необходимости изменять масштаб. Соответственно чтобы графики между собой не плыли и соответствовали между собой по оси Х.

Знаю что хочу слишком много и сразу, но был бы признателен за помощь.


2. на счет скролла - это в примерах qwt было где-то. пробуйте оттуда изъять и применить к себе. скроллироваться будет только полотно графика, а линии (хоть тыща) будут соответственно тоже сколлиться, ибо они лежат на полотне.
3. выводить значения - это копайте в сторону QwtPlotPicker. в примерах используется, разбирайтесь
4. QwtPlotZoom

Автор: _Vitaliy_ 26.12.2009, 15:22

Цитата(azure @ 25.12.2009, 16:31) *
Цитата(_Vitaliy_ @ 10.12.2009, 17:11) *
2. Т.к. ось Х в идеале имеет значение в несколько тысяч единиц, то необходим "скролл", примеры смотрел но не понял. Тем более что графиков планируется около 7 то соответственно они должны "скролироваться" все одновременно.
3. Нужно выводить значение на графике при наведении на него мышкой.
4. При необходимости изменять масштаб. Соответственно чтобы графики между собой не плыли и соответствовали между собой по оси Х.

Знаю что хочу слишком много и сразу, но был бы признателен за помощь.


2. на счет скролла - это в примерах qwt было где-то. пробуйте оттуда изъять и применить к себе. скроллироваться будет только полотно графика, а линии (хоть тыща) будут соответственно тоже сколлиться, ибо они лежат на полотне.
3. выводить значения - это копайте в сторону QwtPlotPicker. в примерах используется, разбирайтесь
4. QwtPlotZoom


Выводить значения я уже научился, а вот необходимого скролла, в примерах к сожалению нет... В примерах есть определенное (константа) значение по осям, график выводится по этой константе, и только при изменении масштаба появляется скролл. А надо чтобы выводилось например 500 единиц и был скролл чтобы пролистать оставшиеся например 5000 единиц...

Автор: azure 28.12.2009, 15:25

Цитата(_Vitaliy_ @ 26.12.2009, 14:22) *
Выводить значения я уже научился, а вот необходимого скролла, в примерах к сожалению нет... В примерах есть определенное (константа) значение по осям, график выводится по этой константе, и только при изменении масштаба появляется скролл. А надо чтобы выводилось например 500 единиц и был скролл чтобы пролистать оставшиеся например 5000 единиц...

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

Автор: _Vitaliy_ 29.12.2009, 10:23

Цитата(azure @ 28.12.2009, 15:25) *
Цитата(_Vitaliy_ @ 26.12.2009, 14:22) *
Выводить значения я уже научился, а вот необходимого скролла, в примерах к сожалению нет... В примерах есть определенное (константа) значение по осям, график выводится по этой константе, и только при изменении масштаба появляется скролл. А надо чтобы выводилось например 500 единиц и был скролл чтобы пролистать оставшиеся например 5000 единиц...

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

вывести и приближать уже умеем, а вот проматывать пока никак, если у вас есть наметки то буду признателен

Автор: azure 29.12.2009, 14:17

Цитата(_Vitaliy_ @ 29.12.2009, 9:23) *
вывести и приближать уже умеем, а вот проматывать пока никак, если у вас есть наметки то буду признателен

я пользовал QwtPlotPanner, но это для панорамирования мышкой, скроллбаров при этом не отображается. если вам надо - то вы разберетесь по примеру realtime_plot из состава qwt.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)