|
Интерфейс масштабирования и перемещения графика 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) доступна
по ссылке.
|