QCustomPlot开启opengl
1. 下载freeglut源码
或者直接下载编译好的:https://www.transmissionzero.co.uk/software/freeglut-devel/
2. 编译freeglut源码
一种方法是安装Cmake编译,一种方法是直接用vs2017及以上编译(README.cmake)
(1)创建build文件夹,来存放cmake编译之后产生的项目文件

(2)cmake编译

(3)打开工程,全编译

(4) 路径:dll、lib


(1)vs2017打开文件夹
(2)更改cmake设置

(3)修改

(4)CMake全部生成
3. QCustomPlot添加OpenGL
(1)添加opengl32.lib、freeglut.lib 添加include
(2)main.cpp添加
#include <GL/freeglut.h> glutInit(&argc, argv);
(3)customplot初始化
ui.widget->setOpenGl(true);
bool b = ui.widget->openGl();//是否开启成功
4. QCustomPlot问题
(1)问题一: 当界面上有多张qcustomplot图表时,多张图表的刷新会出现混乱。
# qcustomplot.cpp
void QCPPaintBufferGlFbo::draw(QCPPainter *painter) const
{
if (!painter || !painter->isActive())
{
qDebug() << Q_FUNC_INFO << "invalid or inactive painter passed";
return;
}
if (!mGlFrameBuffer)
{
qDebug() << Q_FUNC_INFO << "OpenGL frame buffer object doesn't exist, reallocateBuffer was not called?";
return;
}
// 添加这行代码即可
if(QOpenGLContext::currentContext() != mGlContext.toStrongRef()){
mGlContext.toStrongRef()->makeCurrent(mGlContext.toStrongRef()->surface());
}
painter->drawImage(0, 0, mGlFrameBuffer->toImage());
}
(2)问题二: Qt开启高分辨率自适应策略时,QCustomPlot开启opengl之后,图表内的像素比例会出现问题,导致图表显示异常。
# qcustomplot.cpp
QCustomPlot::QCustomPlot(QWidget *parent) :
QWidget(parent),
xAxis(0),
yAxis(0),
xAxis2(0),
yAxis2(0),
legend(0),
mBufferDevicePixelRatio(1.0), // will be adapted to primary screen below
mPlotLayout(0),
mAutoAddPlottableToLegend(true),
mAntialiasedElements(QCP::aeNone),
mNotAntialiasedElements(QCP::aeNone),
mInteractions(0),
mSelectionTolerance(8),
mNoAntialiasingOnDrag(false),
mBackgroundBrush(Qt::white, Qt::SolidPattern),
mBackgroundScaled(true),
mBackgroundScaledMode(Qt::KeepAspectRatioByExpanding),
mCurrentLayer(0),
mPlottingHints(QCP::phCacheLabels|QCP::phImmediateRefresh),
mMultiSelectModifier(Qt::ControlModifier),
mSelectionRectMode(QCP::srmNone),
mSelectionRect(0),
mOpenGl(false),
mMouseHasMoved(false),
mMouseEventLayerable(0),
mMouseSignalLayerable(0),
mReplotting(false),
mReplotQueued(false),
mOpenGlMultisamples(16),
mOpenGlAntialiasedElementsBackup(QCP::aeNone),
mOpenGlCacheLabelsBackup(true)
{
setAttribute(Qt::WA_NoMousePropagation);
setAttribute(Qt::WA_OpaquePaintEvent);
setFocusPolicy(Qt::ClickFocus);
setMouseTracking(true);
QLocale currentLocale = locale();
currentLocale.setNumberOptions(QLocale::OmitGroupSeparator);
setLocale(currentLocale);
#ifdef QCP_DEVICEPIXELRATIO_SUPPORTED
# ifdef QCP_DEVICEPIXELRATIO_FLOAT
setBufferDevicePixelRatio(QApplication::desktop()->devicePixelRatioF()); //将代码中获取设备像素比例改成从桌面获取
// setBufferDevicePixelRatio(QWidget::devicePixelRatioF());
# else
setBufferDevicePixelRatio(QWidget::devicePixelRatio());
# endif
#endif
mOpenGlAntialiasedElementsBackup = mAntialiasedElements;
mOpenGlCacheLabelsBackup = mPlottingHints.testFlag(QCP::phCacheLabels);
// create initial layers:
mLayers.append(new QCPLayer(this, QLatin1String("background")));
mLayers.append(new QCPLayer(this, QLatin1String("grid")));
mLayers.append(new QCPLayer(this, QLatin1String("main")));
mLayers.append(new QCPLayer(this, QLatin1String("axes")));
mLayers.append(new QCPLayer(this, QLatin1String("legend")));
mLayers.append(new QCPLayer(this, QLatin1String("overlay")));
updateLayerIndices();
setCurrentLayer(QLatin1String("main"));
layer(QLatin1String("overlay"))->setMode(QCPLayer::lmBuffered);
// create initial layout, axis rect and legend:
mPlotLayout = new QCPLayoutGrid;
mPlotLayout->initializeParentPlot(this);
mPlotLayout->setParent(this); // important because if parent is QWidget, QCPLayout::sizeConstraintsChanged will call QWidget::updateGeometry
mPlotLayout->setLayer(QLatin1String("main"));
QCPAxisRect *defaultAxisRect = new QCPAxisRect(this, true);
mPlotLayout->addElement(0, 0, defaultAxisRect);
xAxis = defaultAxisRect->axis(QCPAxis::atBottom);
yAxis = defaultAxisRect->axis(QCPAxis::atLeft);
xAxis2 = defaultAxisRect->axis(QCPAxis::atTop);
yAxis2 = defaultAxisRect->axis(QCPAxis::atRight);
legend = new QCPLegend;
legend->setVisible(false);
defaultAxisRect->insetLayout()->addElement(legend, Qt::AlignRight|Qt::AlignTop);
defaultAxisRect->insetLayout()->setMargins(QMargins(12, 12, 12, 12));
defaultAxisRect->setLayer(QLatin1String("background"));
xAxis->setLayer(QLatin1String("axes"));
yAxis->setLayer(QLatin1String("axes"));
xAxis2->setLayer(QLatin1String("axes"));
yAxis2->setLayer(QLatin1String("axes"));
xAxis->grid()->setLayer(QLatin1String("grid"));
yAxis->grid()->setLayer(QLatin1String("grid"));
xAxis2->grid()->setLayer(QLatin1String("grid"));
yAxis2->grid()->setLayer(QLatin1String("grid"));
legend->setLayer(QLatin1String("legend"));
// create selection rect instance:
mSelectionRect = new QCPSelectionRect(this);
mSelectionRect->setLayer(QLatin1String("overlay"));
setViewport(rect()); // needs to be called after mPlotLayout has been created
replot(rpQueuedReplot);
}
天道酬勤 循序渐进 技压群雄
浙公网安备 33010602011771号