На этом уроке мы используем зумм и отобразим рядом с курсором координаты графика.
Пример использования скроллбара можно посмотреть в примере Х:\путь к QWT\examples\realtime_plot.
Читая файл readme можно увидеть такие строки:
ScrollZoomer adds scrollbars for zooming. There are a couple of
reasons why the implementation is a hack and therefore the class
is not part of the Qwt lib, but it should be working with all
types of QwtPlots. Copy the code of scrollbar.[h|cpp] and
scrollzoomer.[h|cpp] to the application code.
таким образом нам необходимо:
1. Скопировать данные файлы в нашу директорию с программой.
2. Подключить их к нашему проекту. Для этого правой кнопкой на проекте выбираем подключить существующие файлы и добавляем в наш проект 4 файла.
Рисунок иллюстрирующий использование кьюткреатора прикреплен в аттаче.
Далее в коде после вывода
// finally, refresh the plot
myPlot->resize(800, 600);
myPlot->replot();
Добавляем такие строки:
// enable zooming
Zoomer *zoomer = new Zoomer(myPlot->canvas());
zoomer->setRubberBandPen(QPen(Qt::red, 2, Qt::DotLine));
zoomer->setTrackerPen(QPen(Qt::red));
zoomer->zoom(0);
в заголовочном файле добавляем такие объявления:
#include <qwt_data.h>
#include <qwt_scale_widget.h>
#include "scrollzoomer.h"
и добавляем переменную
const unsigned int c_rangeMax = 1000;
которая отвечает за размер шкалы, выводимой на экран по одной из осей
и новый класс, отвечающий за зумм:
class Zoomer: public ScrollZoomer
{
public:
Zoomer(QwtPlotCanvas *canvas):
ScrollZoomer(canvas)
{
}
virtual void rescale()
{
QwtScaleWidget *scaleWidget = plot()->axisWidget(yAxis());
QwtScaleDraw *sd = scaleWidget->scaleDraw();
int minExtent = 0;
if ( zoomRectIndex() > 0 )
{
// When scrolling in vertical direction
// the plot is jumping in horizontal direction
// because of the different widths of the labels
// So we better use a fixed extent.
minExtent = sd->spacing() + sd->majTickLength() + 1;
minExtent += sd->labelSize(
scaleWidget->font(), c_rangeMax).width();
}
sd->setMinimumExtent(minExtent);
ScrollZoomer::rescale();
}
};
скомпилировав проект получаем заветный результат.
Теперь если на графике левой кнопкой мыши выделить область и отпустить кнопку мышки получим увеличенное изображение. Для отмены скролирования достаточно нажать правую кнопку. Полезным применением можно назвать тот факт, что при наведении на любое место в плоте и нажав левую кнопку мыши рядом с курсором
появятся координаты: по иксу и по игреку, что позволяют снимать показания с графиков в заданной точке.
Следующим шагом немного "облагородим" наш вывод графиков, для этого
Теперь нам необходимо чтобы плот выводился на все окно, для этого удаляем строку в
void obrabotka::setModel(QStandardItemModel *model)
{
...
QwtPlot *myPlot = new QwtPlot(this);
...
}
добавляем в obrabotka.h в секции:
...
private:
QwtPlot *myPlot;
...
и далее в obrabotka.срр
в конструкторе:
obrabotka::obrabotka(QWidget *parent)
:QDialog(parent)
{
myPlot = new QwtPlot();
}
Теперь добавим в конструктор еще такие строки:
...
QVBoxLayout *l = new QVBoxLayout();
l->addWidget(myPlot);
setLayout(l);
...
и подключим соответствующий инклуд:
#include <QtGui/QVBoxLayout>
Теперь если скомпилировать и запустить проект можно видеть, что при изменении размера окна, наш "плот" вместе с окном также изменяется.
Можно немного еще модифицировать наше приложение используя QwtPlotPicker для вывода на экране координат точек плота для этого добавим в заголовочный файл следующее:
в секцию private:
...
QwtPlotPicker *d_picker;
...
в файле obrabotka.срр в конце нашей функции в которой осуществляем рисование добавляем
...
// enable picker
d_picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
QwtPicker::PointSelection | QwtPicker::DragSelection,
QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn,
myPlot->canvas());
d_picker->setRubberBandPen(QColor(Qt::green));
d_picker->setRubberBand(QwtPicker::CrossRubberBand);
d_picker->setTrackerPen(QColor(Qt::white));
...
скомпилировав проект можем наблюдать рядом с курсором с правой стороны координаты Х и Y точки.
Бывает также полезно выделять точки на кривой, по которой она строится. Для этого делаем следующее.
1. Подключаем в заголовочный файл:
2. В файле obrabotka.срр после объявления QwtPlotCurve *curve1 = new QwtPlotCurve("H ot T") добавляем следующее
...
QwtSymbol symbol1;
symbol1.setStyle(QwtSymbol::Cross);
curve1->setPen(QPen(Qt::red));
symbol1.setPen(QColor(Qt::black));
symbol1.setSize(2);
curve1->setSymbol(symbol1);
curve1->setStyle(QwtPlotCurve::Lines);
...
скомпилировав проект можно видеть что первая кривая красного цвета а ключевые точки черного цвета. Комбинируя различнные параметров QwtSymbol можно добиться желаемого (визуального) результата.
Данный пример (как и предыдущий) взяты из примеров, поставляющихся вместе с Qwt. QwtPicker взят из примера bode, QwtSymbol - curvdemo1, Zoomer - realtime.
Можно было бы еще добавить легенду (пример simple) и сетку (bode) делается по аналогии.
Не раскрытым (пока) остается вопрос вывода на экран только части графика (например 100 единиц по оси Х) и чтобы одновременно был скролл, позволяющий пролистать оставшуюся часть графика. Я пок этот вопрос "не победил", да и на форуме по этому поводу упорно молчат... как с этот вопрос прояснится - появиться следующий урок.
Пример, который раскрывает тему этого урока находится во вложении.