예제 #1
0
// Обработчик нажатия на кнопку мыши над шкалой
// (включение изменения масштаба шкалы)
void QAxisZoomSvc::startAxisZoom(QMouseEvent *mEvent,int ax)
{
    // фиксируем исходные границы графика (если этого еще не было сделано)
    zoom->fixBounds();
    // если в данный момент еще не включен ни один из режимов
    if (zoom->regim() == QwtChartZoom::ctNone)
    {
        // если нажата левая кнопка мыши, то
        // включаем один из режимов масштабирования
        if (mEvent->button() == Qt::LeftButton)
        {
            // получаем указатели на
            QwtPlot *plt = zoom->plot();                // график
            QwtScaleWidget *sw = plt->axisWidget(ax);   // виджет шкалы
            // получаем карту основной горизонтальной шкалы
            QwtScaleMap sm = plt->canvasMap(zoom->masterH());
            // для того чтобы фиксировать начальные левую и правую границы
            scb_xl = sm.s1(); scb_xr = sm.s2(); scb_wx = sm.sDist();
            // аналогично получаем карту основной вертикальной шкалы
            sm = plt->canvasMap(zoom->masterV());
            // для того чтобы фиксировать начальные нижнюю и верхнюю границы
            scb_yb = sm.s1(); scb_yt = sm.s2(); scb_hy = sm.sDist();
            // определяем (для удобства) геометрию
            QRect gc = plt->canvas()->geometry();   // канвы графика
            QRect gw = sw->geometry();              // и виджета шкалы
            // текущее левое смещение графика (в пикселах относительно канвы)
            scb_pxl = plt->transform(zoom->masterH(),scb_xl);
            // текущая ширина графика (в пикселах)
            scb_pw = plt->transform(zoom->masterH(),scb_xr) - scb_pxl;
            // текущее левое смещение графика
            // (в пикселах относительно виджета шкалы)
            sab_pxl = scb_pxl + gc.x() - gw.x();
            // текущее верхнее смещение графика (в пикселах относительно канвы)
            scb_pyt = plt->transform(zoom->masterV(),scb_yt);
            // текущая высота графика (в пикселах)
            scb_ph = plt->transform(zoom->masterV(),scb_yb) - scb_pyt;
            // текущее верхнее смещение графика
            // (в пикселах относительно виджета шкалы)
            sab_pyt = scb_pyt + gc.y() - gw.y();
            // запоминаем текущее положение курсора относительно канвы
            // (за вычетом смещений графика)
            scp_x = mEvent->pos().x() - sab_pxl;
            scp_y = mEvent->pos().y() - sab_pyt;
            // если масштабируется горизонтальная шкала
            if (ax == QwtPlot::xBottom ||
                ax == QwtPlot::xTop)
            {
                // если левая граница меньше правой,
                if (scb_wx > 0)
                    // если ширина канвы больше минимума,
                    if (scb_pw > 36)
                    {
                        // в зависимости от положения курсора
                        // (правее или левее середины шкалы)
                        // включаем соответствующий режим - изменение
                        if (scp_x >= floor((float)(scb_pw/2)))
                            zoom->setRegim(QwtChartZoom::ctAxisHR);     // правой границы
                        else zoom->setRegim(QwtChartZoom::ctAxisHL);    // или левой
                    }
            }
            else    // иначе (масштабируется вертикальная шкала)
            {
                // если нижняя граница меньше верхней,
                if (scb_hy > 0)
                    // если высота канвы больше минимума,
                    if (scb_ph > 18)
                    {
                        // в зависимости от положения курсора
                        // (ниже или выше середины шкалы)
                        // включаем соответствующий режим - изменение
                        if (scp_y >= floor((float)(scb_ph/2)))
                            zoom->setRegim(QwtChartZoom::ctAxisVB);     // нижней границы
                        else zoom->setRegim(QwtChartZoom::ctAxisVT);    // или верхней
                    }
            }
            // если один из режимов был включен
            if (zoom->regim() != QwtChartZoom::ctNone)
            {
                // запоминаем текущий курсор
                tCursor = sw->cursor();
                // устанавливаем курсор PointingHand
                sw->setCursor(Qt::PointingHandCursor);
                // если легкий режим и включена индикация, то
                if (light && indiAxZ)
                {
                    // создаем виджет, индицирующий масштабирование шкалы
                    zwid = new QWidget(plt->axisWidget(ax));
                    // назначаем ему цвет
                    zwid->setStyleSheet(QString(
                        "background-color:rgb(%1,%2,%3);").arg(
                        awClr.red()).arg(awClr.green()).arg(awClr.blue()));
                    // и прорисовываем
                    showZoomWidget(mEvent->pos(),ax);
                }
            }
        }
    }
}