关闭

Qt初学者,一路磕绊,将两天来心得发一下聊以遣怀。

标签: Qt学习笔记错误分析
514人阅读 评论(0) 收藏 举报
分类:

初来乍到水平有限,想到啥说啥,不要见笑。

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文件中类结尾没有分号(;)引起。

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7806次
    • 积分:214
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类