Qt报错:错误 C2039 “Value“: 不是 “`global namespace‘“ 的成员

Qt系列文章目录

前言

最近写Qt信号槽发现编译报错:

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2039 “Value”: 不是 “global namespace'" 的成员 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79 错误 C2039 "Car": 不是 "QtPrivate::List<>" 的成员 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79 错误 C2039 "Cdr": 不是 "QtPrivate::List<>" 的成员 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79 错误 C2039 "Value": 不是 "QtPrivate::List_Left<QtPrivate::List<>,1>" 的成员 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 243 错误 C2039 "Value": 不是 "global namespace’” 的成员 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79
错误 C2338 Signal and slot arguments are not compatible. (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 232
错误 C2338 The slot requires more arguments than the signal provides. (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 230
错误 C2664 “QMetaObject::Connection QObject::connectImpl(const QObject *,void **,const QObject *,void **,QtPrivate::QSlotObjectBase *,Qt::ConnectionType,const int *,const QMetaObject *)”: 无法将参数 5 从“unknown-type ”转换为“QtPrivate::QSlotObjectBase ” (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 241
消息 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 244
消息 参见“QObject::connectImpl”的声明 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 463
消息 参见“QtPrivate::List<>”的声明 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 81
消息 参见“QtPrivate::List<>”的声明 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 81
消息 参见“QtPrivate::List_Left<QtPrivate::List<>,1>”的声明 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 243
错误(活动) E0147 声明与 “void WndTrajectories::on_addTrajKeyPoint()” (已声明 所在行数:44,所属文件:“E:\OSG\WORK\MDI20220530\MDI\WndTrajectories.h”) 不兼容 mdi E:\osg\work\mdi20220530\mdi\WndTrajectories.cpp 253
错误 C2238 意外的标记位于“;”之前 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79
错误 C2062 意外的类型“unknown-type” (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79
消息 查看对正在编译的 类 模板 实例化“QtPrivate::List_Left<QtPrivate::List<>,1>”的引用 (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 243
消息 查看对正在编译的函数 模板 实例化“QMetaObject::Connection QObject::connect<void(__cdecl OsgWindow::
)(void),void(__cdecl WndTrajectories::
)(QString)>(const OsgWindow *,Func1,const WndTrajectories *,Func2,Qt::ConnectionType)”的引用 mdi E:\osg\work\mdi20220530\mdi\WndTrajectories.cpp 39
错误 C2146 语法错误: 缺少“>”(在标识符“Car”的前面) (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79
错误 C2146 语法错误: 缺少“>”(在标识符“Cdr”的前面) (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobjectdefs_impl.h 79
错误 C2146 语法错误: 缺少“>”(在标识符“Value”的前面) (编译源文件 WndTrajectories.cpp) mdi D:\Qt\Qt5.7.0\5.7\msvc2015_64\include\QtCore\qobject.h 243

在这里插入图片描述

一、分析报错原因

根据报错信息初步推算是:Qt信号槽连接语句出错。所以从相关的信号槽分析。
相关类描述:
第一个类:WndTrajectories:最外层工具窗口类,负责界面上的各种工具条,移动、旋转、缩放等按钮,控制三维物体。
第二个类:OsgWindow:中介类,由于类WndTrajectories无法直接和三维渲染窗口类交互,OsgWindow管理渲染窗口类
第三个类:FastView:三维渲染窗口

需求是:当用户在FastView三维渲染窗口操作时,比如移动、旋转、缩放三维物体,WndTrajectories类:最外层工具窗口类要实时响应三维窗口变化,比如提示用户三维物体移动了10米,绕x轴旋转的90度,缩放了2倍等等信息。
设计思想:三维窗口FastView操作时会发出信号(void renderAddTrajKeyPoint();),这个信号连接到OsgWindow的信号(void msg_trajKeyPoint();),然后最外层窗口WndTrajectories用OsgWindow类的msg_trajKeyPoint信号和自己的槽函数(on_addTrajKeyPoint)连接,下面是具体实现类

//信号
class WndTrajectories :public QDockWidget
{
    
    
Q_OBJECT

//槽
private slots:
void on_addTrajKeyPoint(QString fileName);
}

//连接信号和槽
connect(OsgWindow::GetInstance(), &OsgWindow::msg_trajKeyPoint, this, &WndTrajectories::on_addTrajKeyPoint);

第二个类:OsgWindow

class OsgWindow :public QObject
{
    
    
	Q_OBJECT
	//信号
Q_SIGNALS:
void msg_trajKeyPoint();
private:
FastView* m_RenderWindow = nullptr;
}
//连接函数
connect(m_RenderWindow, &FastView::renderAddTrajKeyPoint, this, &OsgWindow::msg_trajKeyPoint);
//槽函数

第三个类:FastView

class FastView : public QMainWindow, CDPEngineListener
{
    
    
	Q_OBJECT
	//信号
	signals:
	void renderAddTrajKeyPoint();

聪明的你也许一眼就看出来,槽函数的参数比信号还多,所以就报错了,但是当程序非常庞大,而且涉及到3个相关类,信号连接信号,信号又和槽关联,真的容易懵圈,我是花了一整天的时间才找出问题,想想真是蓝受香菇啊。。。。。。说出来都是泪呀。。。。。。。

问题解决

把void on_addTrajKeyPoint(QString fileName);
改成
on_addTrajKeyPoint()

猜你喜欢

转载自blog.csdn.net/aoxuestudy/article/details/125938615