// Обработчик нажатия на кнопку мыши над шкалой // (включение изменения масштаба шкалы) 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); } } } } }