В поддержку Qt

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

   

Главная

Статьи:

Установка Qt Creator

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

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

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

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

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

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

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

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

Файлы:

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

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

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

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

 

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

 

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