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

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

使用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

#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!

相关文章
|
12月前
|
测试技术
QT --- VS2017+Qt5.12 编译报错【E2512 功能测试宏的参数必须是简单标识符 】的解决方法
QT --- VS2017+Qt5.12 编译报错【E2512 功能测试宏的参数必须是简单标识符 】的解决方法
336 0
|
17天前
|
算法 计算机视觉
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
19 0
|
23天前
|
Windows
Qtdesigner报错:This application failed to stat could not find or load the Qt platform plugin “windows“
Qtdesigner报错:This application failed to stat could not find or load the Qt platform plugin “windows“
|
2月前
|
C++
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
64 0
|
8月前
《QT从基础到进阶·二十一》QGraphicsView、QGraphicsScene和QGraphicsItem坐标关系和应用
《QT从基础到进阶·二十一》QGraphicsView、QGraphicsScene和QGraphicsItem坐标关系和应用
245 0
《QT从基础到进阶·二十一》QGraphicsView、QGraphicsScene和QGraphicsItem坐标关系和应用
|
8月前
|
缓存
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
334 0
|
8月前
|
C++
《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)
《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)
322 0
|
9月前
|
API Windows
Qt-解决异常报错“QAxBase::setControl: requested control XXX could not be instantiated”
Qt-解决异常报错“QAxBase::setControl: requested control XXX could not be instantiated”
165 0
|
iOS开发 MacOS
Qt 报错:Undefined symbols for architecture arm64
MacBook Pro Apple M1 使用 Qt 6.4.1 的时候碰到的报错,做了不同的尝试,最后解决了这个报错。
595 0
运行QtDesigner.exe报错:it could not find or load the Qt platform plugin “windows“
运行QtDesigner.exe报错:it could not find or load the Qt platform plugin “windows“
运行QtDesigner.exe报错:it could not find or load the Qt platform plugin “windows“