c++ Qt & vs 常见错误解析

9 篇文章 1 订阅

突然翻到2019年的笔记本,看了一下自己所做的笔记,列举着一些Qt 和 VS开发的一些常见错误分析以及相关解决方法,突然就想放在csdn上,便于查看,毕竟笔记本容易掉,放着放着就不知道放哪儿去了 ,虽然随着开发时间的不断增长,这些错误都能轻松解决呀,但还是希望能帮到一些初学者,提供一些帮助,解决一些疑惑。

1.为什么不能直接cout一个string字符串(而需要添加头文件#include<string>)

分析:STL中的许多头文件都包含std::basic_string类定义式,它们间接的包含了<xstring>(但不要试图直接包含<xstring>),保证可以在头文件中使用std::string类:

原型-》 typedef basic_string<char,char_traits<char>,allocator<char>> string;  

问题在于 operator<<却定义在<string>头文件中,必须手动将之包含。

2.Qt error: No rule to make target xxx.h,need by "debug/*.o".stop

分析:pro文件出现冗余的问题(检查.pro文件);

          删除*.o文件后,清楚,再重新构建;

          删除debug目录文件重新构建;

3.Qt error:mutiple undefine of QClass::QClass,复杂定义

分析:检查 pro文件是否存在重复的文件cpp/h文件(重复添加源文件或者头文件)

4.invalid new-expression of abstract class type " "

分析:说明父类有纯虚函数没有实现(子类中)

5.undefined reference to "vtable for ~"

分析:Qt中,类要支持信号和槽机制,需要继承Qobject,并且在头文件中添加Q_OBJECT宏;

          如果创建时,没有选择继承Qobject类或其子类,而创建后手工修改后继承Qobject,并添加Q_OBJECT宏,编译会出现这种错误;

         解决方式就是把新创建的类从项目中移除(不要删除磁盘文件),再次添加文件到项目中,就会重新解析此类,再编译就不会出现上述的错误了。

6.unfined reference to "QClass::staticmetaobject" ?

分析:调用QClass类的文件中,添加类的头文件到pro文件中(添加已存在的文件),即可解决

7.expected class-name before "{  token  }" 

分析:头文字声明没有添加(继承时不要忘记基类的头文件)或基类包含了子类头文件

8.强制转换(父、子类)问题

分析:子类可以转换为父类,父类也可以转换为子类;(父类从哪个子类转换,就会调用哪个子类的函数<虚函数实现>)

9.error:插件项目中,未定义类的相关函数

分析:不仅需要添加.h文件,还需要添加cpp文件(可以通过绝对路径方式添加)

10.QVariant 使用

条件:类需要默认的contructor 和 destructor;

          必须使用Q_DeECLARE_METATYPE宏,类的下面实现,但好像如果继承Qobject类,就不需要添加宏(未检验)。

11.undefined reference to "  _Imp_"

分析:因为库文件没有找到,添加LIBS += -L+路径 + -l库名,可以将其修改为绝对路径就不再报错。

12.如何添加外部库文件?

分析:添加第三方的库文件(#include "xxxx.h");

          添加lib文件(放在对应的工程目录下)

          格式(LIBS += -L+路径 + -l库名)

          添加dll文件(输出目录下)

13.Qt error:makefile makefile error?

分析:检查pro文件是不是有错误(pro文件导致)

14.Qt error:cannot retrieve debugging output?

分析:此错误指无法获取调试输出信息,因打开了多个Qtcreator.exe,需要关闭运行的程序,可以在一个exe中,打开多个项目同时执行。

15.类中的回调函数必须使用static的原因?

分析:如果callback函数是一个类成员函数,就要添加static,原因在于必须舍弃掉类成员函数的隐藏指针this参数;

          否则,会导致函数参数列表与被要求的声明的形式不一致;

类封装回调函数条件:回调函数只能是全局或者静态的;全局函数会破坏类的封装性,顾不予录用;静态函数只能访问类中的静态成员,不能访问非静态。

16.容器释放问题?

分析:工作方式分为(对于内置类型int,char,double,纯粹的位拷贝)和(对于自定义的对象,进入容器的定指定对象的拷贝)

           STL不管是erase或remove都不会释放对象的内存空间,只是师范类STL里面存放的这个对象或指针的空间,需要手动释放(delete,再erase)

17.Qt 主线程执行大量计算,界面卡顿,有什么办法优化?

分析:用线程来解决问题(推荐)和在长时间操作的部分代码加上QApplication::processEvent();

18.程序中 if elseif ... else和switch的效率使用情况 

分析:建议判断超过了3-4个,使用switch,反之使用if else,经过测试(效率时间有所提高,更简洁,美化程序)

19.undefined reference to 'qmain(int,char**)'?

分析:导致此错误的原型①项目中缺少main.cpp文件②main(void)改为main(int argc,char**argv)

           ③项目pro文件内容为空,必须含有内容,不能为空。

20.vector的清楚数据

分析:erase会返回下一个迭代器,vector 经erase后会重新配置空间,导致后面的迭代器受到影响,无法使用,正确使用:

if(*iter)
{
    delete *iter;
    *iter = nullptr;
    iter = vec.erase(iter);
}
else
    iter++;

21.linux-Qt  生成动态库时,产生多个版本号的.so文件,如何解决?

分析:库项目文件pro,添加CONFIG += plugin. 即可解决

22.const + &引用的区别?

const string &c;  不可更改c变量的值

string &c; 可修改变量c的值,并且传入的变量可改变;(引用)

string c;可改变形参的值,但原变量的值不会改变;(值传递)

23.Qt errer:makefile Debug::253 debug moc_q***.cpp  errorc错误

分析:添加Q_OBJECT,但不从QObject继承,则会报错

24.skipping incompatible (不匹配)

分析:环境 系统不匹配(检查是32位或者64位)

25.Qt python  error:fatal python errpr unable to load the file system codec?

分析:①初始化Python 解释器前使用 :py_setPythonName来设置Python的根目录;

②使用py_setpath 来设置模块的路径以及模块文件

py_setpath(L"d:/python/lib;d:/program/test")
           安装路径           模块文件.py

 26.qt 调用 Python,slots出现冲突,如何解决?

分析:slots出现冲突,则通过宏来解决

方法1:冲突地方:前面添加 #undef slots =>取消slots定义(中间则是定义的位置)
方法2:后面添加:后面添加 #define slots Q_SLOTS =>恢复slots宏定义与Qt中ObjectDef.h一致

27.Qt  打包程序

分析:利用Qt自带的命令行窗口,进行打包;

①把exe文件放在自定义文件夹下面
②打开窗口,进入目录里面
③输入:windeployqt xxx.exe 即可

需要的文件dll等都要在此目录下

28.winsock2.h重定义问题?

分析:需要定义 #define WIN32_LEAN_AND_MEAN

29.常量中有换行符 error vs2013 ?

分析:代码中有中文的符号或者中文或者任何不是英文的字符

30.c++ 输入函数

分析:①scanf(),读取字符串时不检查边界,容易内存泄露;

②scanf_s,安全函数,必须提供表明最大多少位字符,防止溢出;

③cin

④cin.get()  cin.get(array,len)  getline(cin,string s)

⑤gets()  getchar()

注意:①②③遇到空格tab/换行符结束;④⑤包含空格,只有遇到换行符结束

31.vs2013:warning C4819:该文件包含不能在当前代码页(936)中表示的字符,请将该文件保存为unicode格式以防止数据丢失?

分析:打开warning文件点击文件  选择 “高级保存选项”,改变编码格式【简体中文】 为 【unicode】即可。

32.warning c4566:通用字符名称“/u202A” 表示的字符不能页(936)中表示出来

分析:复制路径时带着特殊字符,手动输入路径即可。

 

总结:解决问题时,编译出现错误,不要怕错误多,要一个一个的去找,一个一个的解决,有很多错误是重复的或者连贯的(心态要好,不要嫌多),总会解决的。

 

 

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值