使用QT提供的QChartView来绘制图表,提升QGraphicsView控件继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错呢。
使用QGraphicsView显示图表的时候,我们需要将它提升为QChartView.但提升后再此运行一般会发生编译报错,错误发生在自动生成的UI头文件中,如下图:
临时方案(主要是修改ui_xxxx.h文件)终极解决方案(针对网上好多方案都是修改ui_xxx.h文件,然后重新编译后又报错,又要修改)
我们来分析一下这个问题:
带着疑问,我们去看下qchartview.h的源代码:
大概理解或者猜一下,开始一个命名空间?点击进去我们再看看这个QT_CHARTS_BEGIN_NAMESPACE是个什么?
看到这个的话,应该都比较清楚了,这是给QChartView 加了一个命名空间.所以我们在使用的时候要把命名空间带上.清楚这个了,我们开始看怎么解决这个问题。
既然ui_xxx.h文件报错,那么我们先修改一下这个文件,让他不报这个错,看看是否能解决问题.第一种: 将 QtCharts这个命名空间加到我们的代码上。
修改前
#include#include#include#include#include#include#includeQT_BEGIN_NAMESPACE class Ui_MainWindow { public: QWidget *centralwidget; QChartView *graphicsView; // 修改前 ... void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(800, 600); centralwidget = new QWidget(MainWindow); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); graphicsView = new QChartView(centralwidget);// 修改前 ... }
修改后
#include#include#include#include#include#include#includeQT_BEGIN_NAMESPACE class Ui_MainWindow { public: QWidget *centralwidget; QtCharts::QChartView *graphicsView; //修改后 ... void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(800, 600); centralwidget = new QWidget(MainWindow); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); graphicsView = new QtCharts::QChartView(centralwidget); // 修改后 ...
修改后,代码编译通过,运行结果如下:
第二种: 在ui_xxx.h文件中把命名空间加上:using namespace QtCharts; 或者直接使用 QT已经定义好的:QT_CHARTS_USE_NAMESPACE
#include#include#include//using namespace QtCharts; QT_CHARTS_USE_NAMESPACE QT_BEGIN_NAMESPACE
编译运行,也能正常运行.继续思考:这个ui_xxx.h文件是自动生成的,如果重新编译的话,我们的修改都被覆盖掉了,我们难道再去修改? 显然不是最佳方案.
注意到ui_xxx.h的文件注释: WARNING! All changes made in this file will be lost when recompiling UI file!
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者