Автор: _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.