Интерфейс масштабирования и перемещения графика QwtPlot в стиле
TChart из библиотеки компонентов Delphi
Старая редакция статьи, новую можно найти здесь.
В статье "Пример использования виджета
QwtPlot из библиотеки Qwt" рассматривается интерфейс ScrollZoomer
масштабирования и перемещения графика из примера realtime,
поставляемого вместе с библиотекой Qwt. Он позволяет нажатием на
левую кнопку мыши выделить на канве какую-либо область графика и
увидеть ее в увеличенном масштабе. Кроме того, после перерисовки
графика на канве появляются полосы прокрутки, с помощью которых
можно перемещать просматриваемую область. Вернуться к исходному
масштабу графика можно, нажав правую кнопку мыши. Готовый проект
с подключенным интерфейсом ScrollZoomer
доступен по ссылке.
Полосы прокрутки позволяют двигать график только в горизонтальном
и вертикальном направлении, что не всегда удобно иногда хочется
перемещать его по диагонали. На мой взгляд, на много удобнее интерфейс
масштабирования и перемещения графика у компонента TChart
из библиотеки компонентов Delphi и C++Builder. Выделение области,
определяющей новые границы графика, производится так же левой кнопкой
мыши движением слева направо и сверху вниз. При отпускании левой
кнопкой мыши график изменяет свой масштаб. Если попытаться выделить
область в противоположном направлении, то при отпускании кнопки
мыши границы графика вернутся к исходному состоянию. Перемещение
графика (причем в любом направлении) производится при нажатой правой
кнопке мыши. Для сравнения интерфейсов Вы можете посмотреть проект
Delphi с аналогичным графиком.
Вашему вниманию предлагается класс QwtChartZoom,
который обеспечивает интерфейс масштабирования и перемещения графика
QwtPlot в стиле TChart
из библиотеки компонентов Delphi и C++Builder. В качестве приятного
бонуса представляемый здесь класс позволяет увеличивать и уменьшать
размер графика вращением колеса мыши при нажатой клавише Ctrl.
Рассмотрим порядок подключения интерфейса QwtChartZoom
к своему графику.
Пусть виджет QwtPlot с именем myPlot
размещен на форме главного окна приложения. Ниже приведены заголовочный
файл и файл реализации класса MainWindow.
файл "mainwindow.h"
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
Место для размещения дополнительных директив
#include
namespace Ui {
class MainWindow;
}
class MainWindow
: public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget
*parent = 0);
~MainWindow();
Место для размещения секции protected
для указатей на элементы графика и менеджер масштабирования
private:
Ui::MainWindow
*ui;
}
#endif // MAINWINDOW_H
файл "mainwindow.cpp"
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget
*parent) :
QMainWindow(parent),
ui(new
Ui::MainWindow)
{
ui->setupUi(this);
Место для размещения инструкций наполнения графика
и подключения менеджера масштабирования
}
MainWindow::~MainWindow()
{
Место для размещения инструкций удаления менеджера
масштабирования и элементов графика
delete ui;
}
Если форма разрабатывалась с помощью Qt Designer,
то класс MainWindow определен в пространстве
имен Ui, и доступ ко всем элементам формы
осуществляется через указатель ui: например,
ui->myPlot. Пустой график создается при
выполнении инструкции ui->setupUi(this)
в конструкторе главного окна приложения. Далее следует наполнение
графика: создаются кривые с данными, устанавливаются свойства шкал
и т.п. (пример оформления графика приведен в упомянутой выше статье).
После перестроения графика здесь же в конструкторе к нему подключается
менеджер масштабирования и перемещения экземпляр класса QwtChartZoom.
Понятно, что в свой проект надо добавить файлы, реализующие этот
класс. В деструкторе перед удалением объектов из пространства имен
Ui командой delete ui
сначала удаляются менеджер масштабирования и все элементы графика,
созданные в конструкторе командой new. Для
того чтобы иметь доступ к этим элементам в деструкторе, указатели
на них должны являться членами класса MainWindow
и быть объявленными в заголовочном файле.
Таким образом, последовательность подключения интерфейса QwtChartZoom
следующая
1. Копируем в папку со своим проектом файлы
"qwtchartzoom.h" и "qwtchartzoom.cpp",
которые доступны по ссылке.
2. Добавляем скопированные файлы в свой проект
SOURCES += main.cpp\
mainwindow.cpp\
qwtchartzoom.cpp
HEADERS += mainwindow.h\
qwtchartzoom.h
3. В заголовочный файл "mainwindow.h"
включаем дополнительную директиву #include
#include "qwtchartzoom.h"
4. В секции protected
объявляем указатель на менеджер масштабирования и перемещения графика
QwtChartZoom *zoom;
5. В конструкторе главного окна приложения (файл
"mainwindow.cpp") создаем экземпляр
класса QwtChartZoom, и, если необходимо,
переопределяем цвет каймы выделяемой области, задающей новый масштаб
графика
zoom = new
QwtChartZoom(ui->myPlot);
zoom->setRubberBandColor(Qt::white);
6. В деструктор вставляем команду удаления объекта
delete zoom;
Готовый проект с подключенным интерфейсом доступен по ссылке.
Имеется несколько полезных функция управления интерфейсом, о которых
следует упомянуть.
void
QwtChartZoom::setRubberBandColor(QColor
clr)
Устанавливает цвет каймы выделяемой области, задающей новый размер графика.
void
QwtChartZoom::fixBoundaries()
Фиксирует текущие границы графика в качестве исходных. Отмена масштабирования
и перемещения будет возвращать график имеено к этим границам.
void
QwtChartZoom::setWheelFactor(double
fact)
Задает коэффициент масштабирования графика при вращении колеса мыши
(по умолчанию он равен 1.2).
Данная статья освещает ипользование класса QwtChartZoom
версии 1.1. Доступна также старая редакция статьи о версии 1.0.
|