В поддержку Qt

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

   

Главная

Статьи:

Установка Qt Creator

Установка библиотеки Qwt

Сборка Qt Creator из исходников

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

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

Настройка проекта с Qwt

Сборка в Ubuntu для Windows

Установка пакетов без интернета

Установка драйвера NVIDIA

Файлы:

Проект с интерфейсом QwtChartZoom

Проект Delphi с интерфейсом TChart

Проект с интерфейсом ScrollZoomer

Исходники класса QwtChartZoom

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

 

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