问题出现条件:
将QCustomplot控件加到QSplitter中,设置QSplitter属性childrenCollapsible为使能,操作切分条handle使QCP控件隐藏时,打印如下异常:
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
void QCPLayer::drawToPaintBuffer() paint buffer returned inactive painter
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
void QCPLayer::drawToPaintBuffer() paint buffer returned inactive painter
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
void QCPLayer::drawToPaintBuffer() paint buffer returned inactive painter
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
void QCPLayer::drawToPaintBuffer() paint buffer returned inactive painter
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
void QCPLayer::drawToPaintBuffer() paint buffer returned inactive painter
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
void QCPLayer::drawToPaintBuffer() paint buffer returned inactive painter
该异常的修复方式如下:
/* inherits documentation from base class */
QCPPainter *QCPPaintBufferPixmap::startPainting()
{
// QCPAbstractPaintBuffer::setSize 函数中的size可能出现异常;
// 进一步看,调用该函数的 QCustomPlot::setupPaintBuffers() ,在分裂器收起QCP时,其viewport变为0或者负值,导致了该异常,导致异常的代码段: buffer->setSize(viewport().size()); (位于qcp2.1.1源码的约15880行)
if(mBuffer.height() <=0){
mBuffer = QPixmap(1,1);
}
QCPPainter *result = new QCPPainter(&mBuffer);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
result->setRenderHint(QPainter::HighQualityAntialiasing);
#endif
return result;
}