Qt

В поддержку Qt

статьи в помощь разработчику

   

Главная

Статьи:

Пример использования QwtPlot

Масштабирование QwtPlot в стиле TChart

Файлы:

h_cpp.zip

 

Главная > Масштабирование QwtPlot в стиле TChart (версия 1.0)

 

Интерфейс изменения масштаба и перемещения графика QwtPlot в стиле TChart из библиотеки компонентов Delphi

Старая редакция статьи, новую можно найти здесь.

Публикаций, посвященных использованию виджета QwtPlot из библиотеки libqwt, очень мало.

В статье "Библиотека Qwt: как построить график функции на плоскости?", например, затрагиваются вопросы установки библиотеки, приводится своеобразный пример проекта, использующего QwtPlot, и объясняются этапы сборки проекта под Linux и под Windows. Здесь отражены все основные этапы рисования графика: создание области рисования и заголовка графика, подготовка данных, создание кривых и отображение графика.

В статье "Библиотека QWT. Простое приложение, использующее QWT. (Урок 1)" также описывается процесс создания графика, но больший интерес представляет продолжение статьи "Библиотека QWT. Добавляем QwtSymbol, QwtPlotPicker, Zoomer. (Урок 2)", где подключается интерфейс изменения размеров и перемещения графика. Для реализации интерфеса используются средства из примера realtime_plot, поставляемого вместе с библиотекой libqwt.

Левой кнопкой мыши выделяется область, которая определяет новые границы графика. При отпускании левой кнопки мыши график перерисовывается в соответствии с заданными новыми границами, и появляются элементы управления QScrollBar, с помощью которых можно перемещать график. При нажатии на правую кнопку мыши, границы графика возвращаются к исходному состоянию.

На мой взгляд интерфейс перемещения графика не слишком удобный, особенно если при просмотре графика потребуется перемещать его по диагонали. Поскольку никаких альтернативных вариантов нигде не предлагается, пришлось заняться разработкой интерфейса самому.

Вашему вниманию предлагается класс QwtChartZoom, который обеспечивает интерфейс изменения масштаба и перемещения графика QwtPlot в стиле TChart из библиотеки компонентов Delphi и C++Builder.

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

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

Рассмотрим подробнее класс QwtChartZoom.

Заголовочный файл qwtchartzoom.h содержит описание класса, а файл qwtchartzoom.cpp – реализацию его функций-членов. Для использования этого класса вам необходимо добавить эти файлы в свой проект (взять их можно здесь).

Пусть, например, в главном окне приложения MainWindow, которое является наследником класса QMainWindow, размещается график myPlot – экземпляр класса QwtPlot. Сделаем членом класса MainWindow указатель на объект QwtChartZoom, т.е. вставим в файл mainwindow.h объявление переменной, например так

QwtChartZoom *qchz;

Если форма приложения разрабатывалась с помощью Qt Designer, то класс MainWindow определен в пространстве имен Ui, и доступ ко всем элементам формы осуществляется через указатель ui: например, ui->myPlot.

Все, что расположено на форме (в том числе и график), создается в конструкторе MainWindow при вызове функции

ui->setupUi(this);

Сразу после этой строчки (поскольку myPlot уже создан) можно создавать экземпляр класса QwtChartZoom, который будет управлять графиком

qchz = new QwtChartZoom(ui->myPlot,ui->centralWidget);

В качестве параметров конструктору QwtChartZoom передается указатель на график ui->myPlot, чтобы знал чем управлять, и указатель на виджет ui->centralWidget, на котором размещен график, чтобы была возможность что-либо на нем прорисовывать.

Однако, для того чтобы интерфейс управления графиком заработал, надо сделать еще кое-что, а именно, в описании класса MainWindow (файл mainwindow.h) объявить фильтр событий

bool eventFilter(QObject *target,QEvent *event);

зарегестрировать его в конструкторе класса (файл mainwindow.cpp)

ui->myPlot->installEventFilter(this);

а в реализации фильтра вставить вызов функции-обработчика перехваченных событий qchz->procEventFilter()

bool MainWindow::eventFilter(QObject *target,QEvent *event)
{
  qchz->procEventFilter(target,event);
  return QMainWindow::eventFilter(target,event);
}