初来乍到水平有限,想到啥说啥,不要见笑。
1 凡是使用信号槽的类,都必须是由QObject派生,否则编译直接报错。
2 MainWindow.obj : error LNK2019: 无法解析的外部符号 "private: void __thiscall CMainWindow::slotReadDataOut(void)" (?slotReadDataOut@CMainWindow@@AAEXXZ),该符号在函数 "public: virtual int __thiscall CMainWindow::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@CMainWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 中被引用
1>D:\on3000\src\vc\bus0703\bus_in\Debug\bus_in.exe : fatal error LNK1120: 1 个无法解析的外部命令
问题原因:头文件中声明了槽函数的存在,但是忘记在源文件重定义槽函数。
解决办法:定义响应槽函数即可。
3 报错:该文件已在源编辑器之外被修改,是否重新加载
解决办法:菜单:“工具——选项——环境——文档”在“自动加载更改(如果已保存)”前勾选即可。
4 报错:1>d:\on3000\src\vc\bus0703\bus_out\MgrConfigOutDown.h(0): Warning: No relevant classes found. No output generated
问题原因:此类用到信号槽机制,在头文件中没有声明。
解决办法:在头文件中加 Q_OBJECT 即可。
5 信号槽链接声明位置
个人总结就是在一个信号发出对象和槽响应对象都有效的地方,而且这个地方程序一运行就会调用到即可。
一般选择在new一个新对象后把他相关的信号槽连接完善。
6 编写程序头文件时候在最后#endif后再换行一次,作用没体会到,但是这么用就好了(我师父说的)。
7 错误说明:
1>d:\on3000\src\vc\bus0703\bus_out\mgrsocketoutdown.h(34) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\on3000\src\vc\bus0703\bus_out\mgrsocketoutdown.h(34) : warning C4183: “signalDataFromOutDown”: 缺少返回类型;假定为返回“int”的成员函数
问题原因:信号函数声明没有加void类型。
问题解决:从原来的signalDataFromOutDown();前边加一个void改为:void signalDataFromOutDown();
8 错误说明:
1>d:\on3000\src\vc\bus0703\bus_out\mgrsocketoutdown.cpp(151) : error C2275: “CNodeSocket”: 将此类型用作表达式非法
1> d:\on3000\src\vc\bus0703\bus_out\nodesocket.h(7) : 参见“CNodeSocket”的声明
错误代码:
emit signalDisconnectOutDown(CNodeSocket* pSocket);
问题原因:发信号已经是在调用信号函数了,直接写参数就行了,上边代码形式类似于在声明参数。
问题解决:去掉声明部分:emit signalDisconnectOutDown(pSocket);
9 调试报错:error C2664: “bool QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)”: 不能将参数 3 从“CMgrNodeServer”转换为“const QObject *”
错误代码:connect(this, SIGNAL(signalDataToMgrInUp(QByteArray &, int )), m_mgrNodeServerUp, SLOT(slotDataFromMainWindow(QByteArray & , int )));
错误原因:connect的第三个参数m_mgrNodeServerUp是个对象,而不是对象指针,参数类型不对,(楼主找了一小时啊。。。。)。
问题解决:修改后代码:connect(this, SIGNAL(signalDataToMgrInUp(QByteArray &, int )), &m_mgrNodeServerUp, SLOT(slotDataFromMainWindow(QByteArray & , int )));
其实就是多加个&。
归纳总结:参数3说明的是第三个参数有问题,也就是槽函数所在对象有问题,从CMgrNodeServer转换为const QObject*说明了自己用的是个对象,而实际需要的是对象指针!!!
10 这个地方错过两次,每次都找了好久,问题不大但很隐蔽。
所报错误:1>d:\on3000\src\vc\bus自己写的\bu_in_1.0\nodeserver.cpp(18) : error C2248: “CNodeSocket::CNodeSocket”: 无法访问 private 成员(在“CNodeSocket”类中声明)
1> d:\on3000\src\vc\bus自己写的\bu_in_1.0\nodesocket.h(12) : 参见“CNodeSocket::CNodeSocket”的声明
1> d:\on3000\src\vc\bus自己写的\bu_in_1.0\nodesocket.h(7) : 参见“CNodeSocket”的声明
问题原因:构造函数没有声明为public
总结归纳:构造函数如果不声明为公有会被默认为私有,这样就悲剧了。所以我们每次写构造函数和析构函数度的时候不能偷懒,public一定要加上!!!!!!!!!!!
11 C++编程隐蔽错误:error C2533: 构造函数不能有返回类型
.h文件中类结尾没有分号(;)引起。