解决QT QGraphicsView提升到QChartVie

使用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_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 <QtCore/QVariant>
    #include <QtWidgets/QApplication>
    #include <QtWidgets/QMainWindow>
    #include <QtWidgets/QMenuBar>
    #include <QtWidgets/QStatusBar>
    #include <QtWidgets/QWidget>
    #include <qchartview.h>
    QT_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

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

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

#qt##悬赏#
全部评论

相关推荐

机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
07-03 16:13
嘉应学院 Python
xiaolihuam...:很明显骗子,如果是hr直接约你面试了,哪用得着内推,如果是员工的话,你得多优秀,一线员工直接加你微信,
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-25 17:13
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务