完美解決QT?QGraphicsView提升到QChartView報(bào)錯(cuò)的問(wèn)題
QT QGraphicsView 提升到 QChartView報(bào)錯(cuò) 解決方案
本文主要描述,使用QT提供的QChartView來(lái)繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫(xiě)的類(lèi),怎么才能確保提升后編譯不報(bào)錯(cuò).
[問(wèn)題描述]
使用QGraphicsView顯示圖表的時(shí)候,我們需要將它提升為QChartView.但提升后再此運(yùn)行一般會(huì)發(fā)生編譯報(bào)錯(cuò),錯(cuò)誤發(fā)生在自動(dòng)生成的UI頭文件中.如下圖:
使用QT提供的QChartView,提升QGraphicsView后遇到的問(wèn)題解決方案
[解決方案]
臨時(shí)方案(主要是修改ui_xxxx.h文件)終極解決方案(針對(duì)網(wǎng)上好多方案都是修改ui_xxx.h文件,然后重新編譯后又報(bào)錯(cuò),又要修改)
[問(wèn)題分析]
我們來(lái)分析一下這個(gè)問(wèn)題:
- 錯(cuò)誤提示說(shuō) QChartView does not name a type.
- 疑問(wèn)一: 為什么說(shuō) 不能命名成一個(gè)類(lèi)型呢?
- 疑問(wèn)二: ui_mainwindow.h文件中已經(jīng)有qchartview.h頭文件了,不認(rèn)識(shí)QChartView?
帶著疑問(wèn),我們?nèi)タ聪聁chartview.h的源代碼:
大概理解或者猜一下,開(kāi)始一個(gè)命名空間?
點(diǎn)擊進(jìn)去我們?cè)倏纯催@個(gè)QT_CHARTS_BEGIN_NAMESPACE是個(gè)什么?
看到這個(gè)的話(huà),應(yīng)該都比較清楚了,這是給QChartView 加了一個(gè)命名空間.
所以我們?cè)谑褂玫臅r(shí)候要把命名空間帶上.
清楚這個(gè)了,我們開(kāi)始看怎么解決這個(gè)問(wèn)題.
[方案描述]
既然ui_xxx.h文件報(bào)錯(cuò),那么我們先修改一下這個(gè)文件,讓他不報(bào)這個(gè)錯(cuò),看看是否能解決問(wèn)題.
第一種: 將 QtCharts這個(gè)命名空間加到我們的代碼上.
修改前
#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); // 修改后 ...
修改后,代碼編譯通過(guò),運(yùn)行結(jié)果如下:
第二種: 在ui_xxx.h文件中把命名空間加上:using namespace QtCharts; 或者直接使用 QT已經(jīng)定義好的:QT_CHARTS_USE_NAMESPACE
#include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> #include <qchartview.h> //using namespace QtCharts; QT_CHARTS_USE_NAMESPACE QT_BEGIN_NAMESPACE
編譯運(yùn)行,也能正常運(yùn)行.
繼續(xù)思考:
這個(gè)ui_xxx.h文件是自動(dòng)生成的,如果重新編譯的話(huà),我們的修改都被覆蓋掉了,我們難道再去修改? 顯然不是最佳方案.
注意到ui_xxx.h的文件注釋: WARNING! All changes made in this file will be lost when recompiling UI file!
/********************************************************************************
** Form generated from reading UI file ‘mainwindow.ui’
**
** Created by: Qt User Interface Compiler version 5.15.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
所以: 修改ui_xxx.h文件顯然不合適.
那么我們需要將這個(gè)命名空間在ui_xxx.h使用QChartView之前先using.
1.將QT_CHARTS_USE_NAMESPACE 直接添加到 mianwindow.h文件里面.如下:
2.編譯通過(guò),運(yùn)行得到我們想要的結(jié)果將 QT_CHARTS_USE_NAMESPACE 放到mainwindow.cpp里面.
同樣的錯(cuò)誤又出現(xiàn)了
難道不能放到 mainwidow.cpp里面?
既然這個(gè)namespace是在ui_xxx.h文件中用呢,那我把這定義到前面不就可以嗎?
修改后,再一次編譯運(yùn)行: 成功,如下圖:
至于命名空間,大家根據(jù)自己習(xí)慣和情況放到合適的地方就行.
繼承QChartView, 提升QGraphicsView控件
先看問(wèn)題: 如下圖,我們編譯會(huì)報(bào)錯(cuò),但報(bào)錯(cuò)的提示信息和之前的是不一樣的.
提示信息:ui_mainwindow.h:18: error: ctqchartview.h: No such file or directory
提示是說(shuō)找不到這個(gè)文件或文件夾. 怎么理解呢?
意思就是這個(gè)頭文件的路徑不對(duì)了.
看下我們的代碼,ctqchartview是在CtChartView這個(gè)目錄下的. 那我們?cè)趗i_xxx.h文件中修改下路徑
修改路徑后,成功編譯運(yùn)行如下:
修改后,是可以編譯運(yùn)行了,但我們還是會(huì)遇到之前的問(wèn)題,重新編譯后,這塊還是會(huì)報(bào)錯(cuò),我們還要修改再編譯運(yùn)行.
那么有沒(méi)有 一個(gè)修改一次后面就不用再改的方案呢?
答案是肯定的.
方案一:
思考一下,我們ui_xxx.h文件中的 <ctqchartview.h> 是從那來(lái)的?
是不是我們?cè)邳c(diǎn)擊提升的時(shí)候,我們自己填的呢?
如下圖: 這個(gè) 頭文件不就是這個(gè)嗎?
所以u(píng)i_xxx.h文件中會(huì)生成一個(gè) #include “ctqchartview.h” 這句代碼.
但引入進(jìn)去后會(huì)提示找不到, 那我們把路徑加上去,不就可以了嗎? 如下圖,點(diǎn)擊添加
直接編譯運(yùn)行: 成功,如下圖:
方案二:
我們的CtQChartView是繼承QChartView的, 那我們能不能
在提升的時(shí)候,類(lèi)寫(xiě)CtQChartView, 頭文件 qchartview.h 呢?
如下圖:
這樣提升后,我們編譯試試: 報(bào)錯(cuò),看提示應(yīng)該是沒(méi)找到這個(gè)類(lèi).
解決: 在mainwindow.h文件中我們引入#include “CtChartView/ctqchartview.h” 這個(gè)頭文件,再此編譯運(yùn)行.
結(jié)果如下圖:
接著繼續(xù), 看ui_xxx.h文件,發(fā)現(xiàn)聲明: CtQChartView *graphicsView;
定義:graphicsView = new CtQChartView(centralwidget);
都沒(méi)用qchartview.h文件呀, 那把這個(gè)頭文件刪除掉,能編譯成功嗎?
一樣可以成功,那這代表什么呢?
猜想一下,那我們提升的時(shí)候,只寫(xiě)一個(gè)類(lèi),然后在mainwindow.h文件中include的這個(gè)類(lèi)的頭文件,是不是也可以呢?
如下圖:如果不填頭文件的話(huà),不讓添加.
再思考下,那我給這個(gè)頭文件寫(xiě)一個(gè)ui_xxx.h中已經(jīng)存在的頭文件,可行嗎? 或者我把這個(gè)頭文件寫(xiě)成QObject可行嗎?
例如我填一個(gè) QtWidgets/QMenuBar. 編譯運(yùn)行.可成功.
基于以上,我們是不是可以思考一下結(jié)論:
- 提升QGraphicsView 的類(lèi),只要在 ui_xxx.h 頭文件前引用就可以.
- 在xxx.ui文件中提升QGraphicsView的時(shí)候,只要正確填寫(xiě)我們希望提升的類(lèi)名就可以了. 當(dāng)然頭文件也需要填寫(xiě)一個(gè)正確的.
到此這篇關(guān)于完美解決QT QGraphicsView提升到QChartView報(bào)錯(cuò)的問(wèn)題的文章就介紹到這了,更多相關(guān)QChartView報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(22.生成括號(hào))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(22.生成括號(hào)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++ std::initializer_list 實(shí)現(xiàn)原理解析及遇到問(wèn)題
這篇文章主要介紹了C++ std::initializer_list 實(shí)現(xiàn)原理勘誤,本文通過(guò)源碼解析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02C++可調(diào)用對(duì)象callable object深入分析
所謂的callable object,表示可以被某種方式調(diào)用其某些函數(shù)的對(duì)象。它可以是:一個(gè)函數(shù)、一個(gè)指向成員函數(shù)的指針、一個(gè)函數(shù)對(duì)象,該對(duì)象擁有operator()、一個(gè)lambda表達(dá)式,嚴(yán)格的說(shuō)它是一種函數(shù)對(duì)象2022-08-08C++語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)五子棋
這篇文章主要為大家詳細(xì)介紹了C++語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)五子棋,包括數(shù)據(jù)結(jié)構(gòu)和對(duì)象設(shè)計(jì)及主函數(shù)調(diào)用實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09