LINUX.ORG.RU

[qwt] QwtPlotZoomer

 


0

0

Где можно посмотреть как с ним работать? Документация к Qwt помогает слабо. Например откуда он берёт размеры QwtPlotCanvas до которых надо вернуться при выходе из зума? Как эти размеры задать?

★★★★★

Ответ на: комментарий от KblCb

addAllCurves();
plotter->replot();
zommer->setZoomBase(false); // зуммер сам возмет размери из QwtPlotCanvas

После изменения размеров QwtPlotCanvas(когда присвоиш новые данные кривым или добавишь/удалишь кривые итд) вызывай zommer->setZoomBase(false).

Devix
()
Ответ на: комментарий от Devix

У меня есть класс наследник QwtPlot'а. Для него replot определён как QwtPlot::replot() + ещё что-то (например изменение минимального или максимального значения по шкале). Добавил в ещё что-то zommer->setZoomBase(false). В лучшем случае работает рамка выделения и не работает зум (если zommer был инициализирован как QwtPlotZoom( this->canvas, false )). В худшем - ошибка сегментирования.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от Devix

Вот конструктор.

Samopisetz::Samopisetz( QRectF rect, QWidget* parent ) : QwtPlot( parent )
{
    this->curves = new QMap<QString, Curve*>;
    this->setPlotSize( rect );

    this->zoomer = new QwtPlotZoomer( this->canvas(), false );
    this->zoomer->setRubberBandPen( QPen( Qt::red, 1, Qt::DotLine ) );
    this->zoomer->setTrackerPen( QPen( Qt::red ) );
    qDebug() << this->zoomer->zoomBase();
}
Вот слот который дёргает replot()
void Samopisetz::replot()
{
    if ( ! this->curves->isEmpty() )
    {
        for ( QMap<QString, Curve*>::iterator i = this->curves->begin();
                                              i != this->curves->end();
                                            ++i )
        {
            Curve *tmp = i.value();
            tmp->update();
        }
    }


    this->setAxisScale( QwtPlot::xBottom, left_lim, right_lim, 0 );
    this->setAxisScale( QwtPlot::yLeft, bottom_lim, top_lim, 0 );

    QwtPlot::replot();
    this->zoomer->setZoomBase( false );
}
Сам слот реагирует на сигнал от кнопки.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

QwtPlot::replot() - виртуальная функиция, и твоя функция void Samopisetz::replot() будет вызыватся вместо QwtPlot::replot() возможно когда ты вызываешь tmp->update() автоматически(QwtPlot::setAutoReplot(bool)) вызывается Samopisetz::replot() и после того как место в стеке заканчивается твоя программа падает.

Посмотрел в своих исходниках и увидел что после setAxisScale я вызываю QwtPlot::updateAxes() сейчас не могу вспомнить зачем. Попробуй возможно поможет. Помню сам тоже мучался с qwt.

this->setAxisScale( QwtPlot::xBottom, left_lim, right_lim, 0 );
this->setAxisScale( QwtPlot::yLeft, bottom_lim, top_lim, 0 );

QwtPlot::updateAxes();

QwtPlot::replot();

qDebug() << this->zoomer->zoomBase();
this->zoomer->setZoomBase( false );
qDebug() << this->zoomer->zoomBase();

Devix
()
Ответ на: комментарий от Devix

Вот здесь хранятся размеры шкал:

const QwtScaleDiv *QwtPlot::axisScaleDiv(int axisId)
double QwtScaleDiv::lowerBound()
double QwtScaleDiv::upperBound()

Devix
()
Ответ на: комментарий от Devix

QwtPlot::replot() - виртуальная функиция, и твоя функция void Samopisetz::replot() будет вызыватся вместо QwtPlot::replot() возможно когда ты вызываешь tmp->update() автоматически(QwtPlot::setAutoReplot(bool)) вызывается Samopisetz::replot() и после того как место в стеке заканчивается твоя программа падает.

Разделили методы по именам. Всё заработало. Спасибо, буду ковыряться дальше.

KblCb ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.