Qt系列文章目录
文章目录
- 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)连接,下面是具体实现类
第二个类:OsgWindow
第三个类:FastView
聪明的你也许一眼就看出来,槽函数的参数比信号还多,所以就报错了,但是当程序非常庞大,而且涉及到3个相关类,信号连接信号,信号又和槽关联,真的容易懵圈,我是花了一整天的时间才找出问题,想想真是蓝受香菇啊。。。。。。说出来都是泪呀。。。。。。。
问题解决
把void on_addTrajKeyPoint(QString fileName);
改成
on_addTrajKeyPoint()