I figured out from Qwt sources that grid drawing depends on QwtScaleMap object. So I decided to override "canvasMap" method of QwtPlot class and pass the scale widget of another plot with visible scale.
void OneAxisDisabledPlot
::setDisabledAxis(int axisId,
QwtScaleWidget* baseWidget
) {
enableAxis(axisId, false);
m_disabledAxis = axisId;
m_baseScaleWidget = baseWidget;
}
bool OneAxisDisabledPlot::isAxisDisabled(int axisId) const
{
return m_disabledAxis == axisId;
}
QwtScaleMap OneAxisDisabledPlot
::canvasMap(int axisId
) const {
if(!canvas())
return map;
map.setTransformation(axisScaleEngine(axisId)->transformation());
map.setScaleInterval(sd.lowerBound(), sd.upperBound());
const QwtScaleWidget *s
= isAxisDisabled
(axisId
) ? m_baseScaleWidget
: axisWidget
(axisId
);
if(axisEnabled(axisId) || isAxisDisabled(axisId))
{
if(axisId == yLeft || axisId == yRight)
{
double y = s->y() + s->startBorderDist() - canvas()->y();
double h = s->height() - s->startBorderDist() - s->endBorderDist();
map.setPaintInterval(y + h, y);
}
else
{
double x = s->x() + s->startBorderDist() - canvas()->x();
double w = s->width() - s->startBorderDist() - s->endBorderDist();
map.setPaintInterval(x, x + w);
}
}
else
{
const QRect &canvasRect
= canvas
()->contentsRect
();
if(axisId == yLeft || axisId == yRight)
{
int top = 0;
if(!plotLayout()->alignCanvasToScale(xTop))
top = plotLayout()->canvasMargin(xTop);
int bottom = 0;
if(!plotLayout()->alignCanvasToScale(xBottom))
bottom = plotLayout()->canvasMargin(xBottom);
map.setPaintInterval(canvasRect.bottom() - bottom,
canvasRect.top() + top);
}
else
{
int left = 0;
if(!plotLayout()->alignCanvasToScale(yLeft))
left = plotLayout()->canvasMargin(yLeft);
int right = 0;
if(!plotLayout()->alignCanvasToScale(yRight))
right = plotLayout()->canvasMargin(yRight);
map.setPaintInterval(canvasRect.left() + left,
canvasRect.right() - right);
}
}
return map;
}
void OneAxisDisabledPlot::setDisabledAxis(int axisId, QwtScaleWidget* baseWidget)
{
enableAxis(axisId, false);
m_disabledAxis = axisId;
m_baseScaleWidget = baseWidget;
}
bool OneAxisDisabledPlot::isAxisDisabled(int axisId) const
{
return m_disabledAxis == axisId;
}
QwtScaleMap OneAxisDisabledPlot::canvasMap(int axisId) const
{
QwtScaleMap map;
if(!canvas())
return map;
map.setTransformation(axisScaleEngine(axisId)->transformation());
const QwtScaleDiv &sd = axisScaleDiv(axisId);
map.setScaleInterval(sd.lowerBound(), sd.upperBound());
const QwtScaleWidget *s = isAxisDisabled(axisId) ? m_baseScaleWidget : axisWidget(axisId);
if(axisEnabled(axisId) || isAxisDisabled(axisId))
{
if(axisId == yLeft || axisId == yRight)
{
double y = s->y() + s->startBorderDist() - canvas()->y();
double h = s->height() - s->startBorderDist() - s->endBorderDist();
map.setPaintInterval(y + h, y);
}
else
{
double x = s->x() + s->startBorderDist() - canvas()->x();
double w = s->width() - s->startBorderDist() - s->endBorderDist();
map.setPaintInterval(x, x + w);
}
}
else
{
const QRect &canvasRect = canvas()->contentsRect();
if(axisId == yLeft || axisId == yRight)
{
int top = 0;
if(!plotLayout()->alignCanvasToScale(xTop))
top = plotLayout()->canvasMargin(xTop);
int bottom = 0;
if(!plotLayout()->alignCanvasToScale(xBottom))
bottom = plotLayout()->canvasMargin(xBottom);
map.setPaintInterval(canvasRect.bottom() - bottom,
canvasRect.top() + top);
}
else
{
int left = 0;
if(!plotLayout()->alignCanvasToScale(yLeft))
left = plotLayout()->canvasMargin(yLeft);
int right = 0;
if(!plotLayout()->alignCanvasToScale(yRight))
right = plotLayout()->canvasMargin(yRight);
map.setPaintInterval(canvasRect.left() + left,
canvasRect.right() - right);
}
}
return map;
}
To copy to clipboard, switch view to plain text mode
Bookmarks