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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值