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); }
天道酬勤 循序渐进 技压群雄