Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Qwt выделение части графика
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
VolnovodT00
Всем привет!
Можно ли в qwt выделить часть графика? С отрисовкой выделения, как в аудио редакторах. Заранее спасибо
nikita
Цитата(VolnovodT00 @ 9.3.2013, 21:13) *
Всем привет!
Можно ли в qwt выделить часть графика? С отрисовкой выделения, как в аудио редакторах. Заранее спасибо


В принципе все довольно не сложно. Идея такова :
1. Создаем класс у которого объявляем 2 члена типа QwtPlot (исходный d_aPlot и масштабированный d_pPlot)
2. Объявляем в этом классе поле QwtPlotPicker *d_pPicker;
3. Создаем все объекты в конструкторе (приблизительный вид кода):
PlotWidget::PlotWidget(QWidget *parent, Plot2_D *aPlot) : QWidget(parent)
{
    setAttribute(Qt::WA_DeleteOnClose);

        d_aPlot = aPlot
    d_pPlot = new Plot2_D(1,this);
    d_pPlot->setMargin(5);
    setContextMenuPolicy(Qt::NoContextMenu);

    d_aPanner = new QwtPlotPanner(d_aPlot->canvas());
    d_aPanner->setMouseButton(Qt::MidButton);

    d_pPicker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::RectSelection | QwtPicker::DragSelection, QwtPlotPicker::RectRubberBand, QwtPicker::AlwaysOn, d_pPlot->canvas());
    d_pPicker->setRubberBandPen(QColor(Qt::red));
    d_pPicker->setTrackerPen(QColor(Qt::yellow));

    d_aPicker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::PointSelection | QwtPicker::DragSelection, QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn, d_aPlot->canvas());
    d_aPicker->setRubberBandPen(QColor(Qt::red));
    d_aPicker->setTrackerPen(QColor(Qt::yellow));

    QGridLayout *gl = new QGridLayout(this);
    gl->addWidget(d_pPlot);
    gl->setContentsMargins(0, 0, 0, 0);

    d_aPlot->setAxisScale(QwtPlot::xBottom, 0, 360);
    d_pPlot->setAxisScale(QwtPlot::xBottom, 0, 360);

    connect(d_pPicker, SIGNAL(selected(const QwtDoubleRect &)), SLOT(on_selected(const QwtDoubleRect &)));
}


4. Вид слота on_select:
void PlotWidget::on_selected(const QwtDoubleRect &rect)
{
    double maxX, minX, maxY, minY;
    if(rect.left() < rect.right())
    {
        minX = rect.left();
        maxX = rect.right();
    }
    else
    {
        minX = rect.right();
        maxX = rect.left();
    }
    if(rect.top() < rect.bottom())
    {
        minY = rect.top();
        maxY = rect.bottom();
    }
    else
    {
        minY = rect.bottom();
        maxX = rect.top();
    }
    if(minY != maxY && minX != maxX )
    {
        d_aPlot->setAxisScale(QwtPlot::xBottom, minX, maxX);
        d_aPlot->setAxisScale(QwtPlot::yLeft, minY, maxY);
        d_aPlot->minX = minX-d_aPlot->minAxisX;
        d_aPlot->maxX = maxX-d_aPlot->minAxisX;
        d_aPlot->minY = minY;
        d_aPlot->maxY = maxY;

        m_flagSelect = true;

        d_pPlot->paintRectengle(d_aPlot->minAxisX+d_aPlot->minX,d_aPlot->minAxisX+d_aPlot->maxX,d_aPlot->minY,d_aPlot->maxY);
    }
  d_aPlot->replot();
}


P.S.: Plot2_D - это мой класс, наследник от QwtPlot
Алексей1153
я делал по-простому - поверх морды виджета растягиваю мышкой полупрозрачный виджет, затем мапирую на координаты области построения и задаю новые границы осям.


Нажмите для просмотра прикрепленного файла

От пикера показываю только координаты, а "родная" выделялка больно уж убогой показалась
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.