Как можно создать собственный класс QwtWidgetOverlay?

Как можно создать элемент <b>QwtPlotMarker</b>, который будет отображаться поверх элемента <b>QwtCurvePlot</b> без использования метода <b>replot()</b>, чтобы повысить скорость отрисовки? Пытаюсь разработать собственный класс <b>QwtWidgetOverlay</b>, но не уверен, с чего начать. Можете ли вы дать подсказку, используя пример <b>itemeditor</b>? <br/> <br/> Ссылка на пример <b>itemeditor</b>: <br/> <br/> <a href="https://github.com/opencor/qwt/tree/master/examples/itemeditor" rel="nofollow">https://github.com/opencor/qwt/tree/master/example...</a>
  • 15 июня 2024 г. 14:01
Ответы на вопрос 1
Для создания собственного класса QwtWidgetOverlay вы можете начать с создания нового класса, который наследуется от QwtPlotItem. В этом классе вы можете реализовать методы для отображения вашего элемента поверх элемента QwtCurvePlot.

Вот пример того, как можно создать класс QwtWidgetOverlay:

```cpp
#include <qwt_plot_item.h>

class QwtWidgetOverlay : public QwtPlotItem
{
public:
    QwtWidgetOverlay(QWidget *widget = nullptr) : QwtPlotItem()
    {
        setScaleMap(QwtPlot::xBottom, QwtPlot::yLeft, QwtScaleMap::Identity);
        attach(widget);
    }

    void draw(QPainter *painter, const QwtScaleMap &, const QwtScaleMap &, const QRectF &canvasRect) const override
    {
        if(widget())
        {
            painter->save();
            painter->setRenderHint(QPainter::Antialiasing, true);

            QRectF widgetRect(widget()->geometry());
            widgetRect.moveTopLeft(canvasRect.topLeft());

            widget()->render(painter, widgetRect, widgetRect);
            painter->restore();
        }
    }
};
```

Чтобы создать элемент QwtPlotMarker, который будет отображаться поверх элемента QwtCurvePlot без перерисовки, можно воспользоваться методом QwtCurvePlot::updateCanvas(), который принудительно обновляет содержимое канвы. После создания маркера, можно добавить его на канву и вызвать метод updateCanvas(), чтобы он отобразился:

```cpp
QwtPlotMarker *marker = new QwtPlotMarker();
// Настройка маркера

plot->addMarker(marker);
plot->updateCanvas();
```

Если вы разрабатываете собственный класс QwtWidgetOverlay и хотите использовать его для отображения маркера, можно создать экземпляр класса QwtWidgetOverlay с виджетом маркера и добавить его на канву. Не забудьте вызвать updateCanvas() после добавления элемента.

Надеюсь, что эти примеры и подсказки помогут вам создать необходимый функционал. В случае дополнительных вопросов не стесняйтесь обращаться!
Похожие вопросы