运用QT供给的QChartView来制作图表,提升QGraphicsView控件承继QChartView后,然后将QGraphicsView提升到咱们自己写的类,怎样才能保证提升后编译不报错呢。

[问题描述]

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

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

运用QT供给的QChartView,提升QGraphicsView后遇到的问题处理计划

[处理计划]

临时计划(主要是修正ui_xxxx.h文件)终极处理计划(针对网上很多计划都是修正ui_xxx.h文件,然后从头编译后又报错,又要修正)

[问题剖析]

咱们来剖析一下这个问题:

  • 过错提示说 QChartView does not name a type.
  • 疑问一: 为什么说 不能命名成一个类型呢?
  • 疑问二: ui_mainwindow.h文件中已经有qchartview.h头文件了,不认识QChartView?

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

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

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

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

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

看到这个的话,应该都比较清楚了,这是给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); // 修正后
        ...

修正后,代码编译通过,运转结果如下:

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

第二种: 在ui_xxx.h文件中把命名空间加上:using namespace QtCharts; 或许直接运用 QT已经定义好的:QT_CHARTS_USE_NAMESPACE

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

#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>
#include <qchartview.h>
//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!