Класс, полученный из QwtPlotZoomer, не работает должным образом - PullRequest
0 голосов
/ 21 декабря 2018

Я пишу класс MyPlotZoomer, производный от QwtPlotZoomer.MyPlotZoomer отличается от QwtPlotZoomer тем, что для активации и рисования прямоугольника масштабирования пользователь должен нажать и удерживать клавишу ctrl, щелкнуть и перетащить, а затем отпустить кнопку мыши.

Для этогоЯ переопределил три метода из QWtPlotZoomer, widgetMouseReleaseEvent, widgetMousePressEvent и widgetMouseMoveEvent следующим образом:

#include <QWidget>
#include "qwt_plot.h"
#include "qwt_plot_zoomer.h"
#include <QMouseEvent>

class MyPlotZoomer : public QwtPlotZoomer
{

  public:
    // constructor
        explicit MyPlotZoomer( QWidget *canvas );
    // destructor

    // function prototypes

    // data
  protected:
    // function prototypes
    virtual void widgetMouseReleaseEvent( QMouseEvent *mouse_event ) override{
        if( mouse_event->modifiers() & Qt::ControlModifier ){
          QwtPlotZoomer::widgetMouseReleaseEvent( mouse_event );
        }
    };

    virtual void widgetMousePressEvent( QMouseEvent *mouse_event ) override{
        if( mouse_event->modifiers() & Qt::ControlModifier ){
          QwtPlotZoomer::widgetMousePressEvent( mouse_event );
        }
    };
    virtual void widgetMouseMoveEvent( QMouseEvent *mouse_event ) override{
        if( mouse_event->modifiers() & Qt::ControlModifier ){
          QwtZoomer::widgetMouseMoveEvent( mouse_event );
        }
    };


};

Однако нажатие клавиши ctrl и рисование ничего не делают.Прямоугольный зум не отображается.Что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Одним из базовых классов QwtPlotZoomer является QwtEventPattern, который позволяет изменить тип используемого сочетания клавиш и мыши.Таким образом, нет причин для получения из QwtPlotZoomer, так как setKeyPattern / setMousePattern делает это намного проще.

Используемые шаблоны мыши / ключа зависят от конечного автомата (QwtPickerMachine), назначенного вашему zoomer.Проверьте документацию соответствующего класса.

0 голосов
/ 21 декабря 2018

Вам необходимо заменить

if( mouse_event->modifiers() & Qt::ControlModifier ){

на

if( mouse_event->modifiers().testFlag(Qt::ControlModifier) ){

или

if( mouse_event->modifiers() | Qt::ControlModifier ){

и в других местах

Дополнение. Чтобы увеличить / уменьшить масштаб, вам нужно вызвать QwtPlotZoomer :: zoom () для события release.На событии пресса, чтобы начать создавать прямоугольник, на ходу - соответственно изменить прямоугольник и в выпуске вызвать масштабирование с этим прямоугольником в качестве аргумента

...