@WTFAYD

Как заставить работать QwtPlotPicker и QQuickPaintedItem вместе?

Здравствуйте.

Есть задача реализовать программу, которая строит график по точкам на QML. Решил использовать для этого Qwt и QQuickPaintedItem.

class QmlQwtPlot : public QQuickPaintedItem
{
    Q_OBJECT

public:
    QmlQwtPlot(QQuickItem* parent = 0);
    ~QmlQwtPlot();

    void paint(QPainter *painter) override;

    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    void wheelEvent(QWheelEvent *event) override;

private:
    QwtPlot* qwtPlot;
    QwtPlotPanner* panner;
    bool isDragging;
    QPoint previousPosition;
    QwtPlotPicker* picker;
};


Возможность перемещения графика мышкой удалось реализовать через QwtPlotPanner и mouseMoveEvent():
void QmlQwtPlot::mouseMoveEvent(QMouseEvent* event) {
    if (isDragging) {  // if the mouse button has been pressed
        QPoint currentPosition = event->pos();
        QPoint diff = currentPosition - previousPosition;
        emit panner->panned(diff.x(),diff.y());
        previousPosition = event->pos();
        update();
    }
}


Однако никак не получается использовать QwtPlotPicker для того, чтобы отображать курсор (координаты около курсора и перекресная линия на графике). Данный класс прекрасно работает с QWidget:

/* QWidget's child constructor (the same is in QQuickPaintedItem's one) */
PlottingWidget::PlottingWidget(QWidget *parent)
    : QWidget(parent)
{
    // ...
    d_picker = new QwtPlotPicker(
        QwtPlot::xBottom, QwtPlot::yLeft,
        QwtPlotPicker::CrossRubberBand,
        QwtPicker::AlwaysOn,
        plot->canvas() 
    );

    d_picker->setRubberBandPen( QColor( Qt::red ) );
    d_picker->setTrackerPen( QColor( Qt::black ) );
    d_picker->setStateMachine( new QwtPickerTrackerMachine() );

    // ...
}


Подскажите пожалуйста, как быть в этой ситуации? Писать собственный класс?
  • Вопрос задан
  • 442 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы