写点什么

解决 QT QGraphicsView 提升到 QChartView 报错的问题

作者:向阳逐梦
  • 2023-06-26
    四川
  • 本文字数:1564 字

    阅读完需:约 5 分钟

解决QT QGraphicsView提升到QChartView报错的问题

使用 QT 提供的 QChartView 来绘制图表,提升 QGraphicsView 控件继承 QChartView 后,然后将 QGraphicsView 提升到我们自己写的类,怎么才能确保提升后编译不报错呢。

[问题描述]

使用 QGraphicsView 显示图表的时候,我们需要将它提升为 QChartView.但提升后再此运行一般会发生编译报错,错误发生在自动生成的 UI 头文件中,如下图:

使用 QT 提供的 QChartView,提升 QGraphicsView 后遇到的问题解决方案

[解决方案]

临时方案(主要是修改 ui_xxxx.h 文件)终极解决方案(针对网上好多方案都是修改 ui_xxx.h 文件,然后重新编译后又报错,又要修改)

[问题分析]

我们来分析一下这个问题:

  • 错误提示说 QChartView does not name a type.

  • 疑问一: 为什么说 不能命名成一个类型呢?

  • 疑问二: ui_mainwindow.h 文件中已经有 qchartview.h 头文件了,不认识 QChartView?

带着疑问,我们去看下 qchartview.h 的源代码:

大概理解或者猜一下,开始一个命名空间?点击进去我们再看看这个 QT_CHARTS_BEGIN_NAMESPACE 是个什么?

看到这个的话,应该都比较清楚了,这是给 QChartView 加了一个命名空间.所以我们在使用的时候要把命名空间带上.清楚这个了,我们开始看怎么解决这个问题。

[方案描述]

既然 ui_xxx.h 文件报错,那么我们先修改一下这个文件,让他不报这个错,看看是否能解决问题.第一种: 将 QtCharts 这个命名空间加到我们的代码上。

修改前

#include <QtCore/QVariant>#include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow>#include <QtWidgets/QMenuBar>#include <QtWidgets/QStatusBar>#include <QtWidgets/QWidget>#include <qchartview.h>QT_BEGIN_NAMESPACEclass 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 <QtCore/QVariant>#include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow>#include <QtWidgets/QMenuBar>#include <QtWidgets/QStatusBar>#include <QtWidgets/QWidget>#include <qchartview.h>QT_BEGIN_NAMESPACEclass 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 <QtWidgets/QStatusBar>#include <QtWidgets/QWidget>#include <qchartview.h>//using namespace  QtCharts;QT_CHARTS_USE_NAMESPACEQT_BEGIN_NAMESPACE
复制代码

编译运行,也能正常运行.继续思考:这个 ui_xxx.h 文件是自动生成的,如果重新编译的话,我们的修改都被覆盖掉了,我们难道再去修改? 显然不是最佳方案.

注意到 ui_xxx.h 的文件注释: WARNING! All changes made in this file will be lost when recompiling UI file!


发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
解决QT QGraphicsView提升到QChartView报错的问题_向阳逐梦_InfoQ写作社区