当前位置:   article > 正文

QT:遇到的报错、bug及解决方法_qt处于debug中遇到delete会停止

qt处于debug中遇到delete会停止

目录

Bug1:2个重载没有“this”指针的合法转换

Bug2:已超过最大连接数,请关闭其他客户端重试

Bug3:在执行redo和undo的时候程序崩溃

Bug4:使用dynamic_cast时提示dynamic_cast的目标类型无效

Bug5:提示非标准语法;请使用 "&" 来创建指向成员的指针

Bug6:invalid null parameter

Bug7:尝试引用已删除的函数/不能实例化抽象类

Bug8:无法隐式捕获,因为尚未指定默认捕捉模式

Bug9:Debugger encountered an exception: Exception at 0x7fffff3ba7e8, code: 0xc0000005: read access violation at: 0xffffffffffffffff, flags=0x0

Bug10:Attempting to add QLayout "" to xxx "widget",which already has a layout

Bug11: obj LNK2001: 无法解析的外部符号 

Bug12:error: C1083: 无法打开包括文件: “xxx.h”: No such file or directory

Bug13:qt启动慢且无响应,任务管理器显示在后台运行,但qt界面就是没出来,出现界面后点击无响应。


Bug1:2个重载没有“this”指针的合法转换

 

解决方法

这个问题是函数作用域问题。因为我定义的undoMap和redoMap在connect外部,而我在connect里调用了undoMap。只需要将定于移到connect里即可。

Bug2:已超过最大连接数,请关闭其他客户端重试

 解决方法

这个提示看似是连接数超了,其实是因为调用到的函数头文件中的#ifndef#define没有修改(就是函数写的时候为了偷懒直接复制了其他的头文件,但是没有修改#ifndef#define,导致了重复,让程序在找这个函数的时候没找到)。

Bug3:在执行redo和undo的时候程序崩溃

解决方法

Debug时发现在push(cmd)这里出错了。发现是因为没有new undoStack()就直接调用了。

在Scene界面new一下即可。

Bug4:使用dynamic_cast时提示dynamic_cast的目标类型无效

 解决方法

添加转换类型的头文件。

比如,图中的错误,添加头文件

#include "GroupItem.h"

#include "BaseNodeItem.h"  即可解决问题。

【注意】在调用其他类的时候,发现无法使用对应类的方法,可以看看是不是忘记加头文件了。

Bug5:提示非标准语法;请使用 "&" 来创建指向成员的指针

 解决方法:

该提示表明在调用成员函数的函数没有添加()

这里只需要把第二个getScene改为getScene(),即可通过。

Bug6:invalid null parameter

 解决方法:

情况一:先new,再connect

指针为空,指针没指向对象,需要进行初始化才可以
1.指针new的对象在其connect之后
2.指针并未new出对象

情况二:将connect写到其他地方

这里遇到的就是情况二,我在初始化的时候使用connect,想让view获取scene传来的参数,但是因为初始化时还没有scene所以提示为空。在view里找一个函数,先对scene判空一下,再使用connect更为保险。

Bug7:尝试引用已删除的函数/不能实例化抽象类

这个两种报错的实质是一样的。即传入是指针,接收变量没有 星号(*)

解决方法

这个问题产生的原因是因为转入的是指针,但是接收的构造函数不是指针,只要在构造对应的变量时添加 * 即可解决。

将BaseObjectItem _nextParent; 改成 BaseObjectItem *_nextParent;


解决方法:

将QGraphicsItem _nextParent; 改成 QGraphicsItem *_nextParent;

Bug8:无法隐式捕获,因为尚未指定默认捕捉模式

解决方法:

修改connect中的[]中的值。

默认捕获模式为[=](按值)和[&](按引用)。 [ ]表示没有捕获。

Bug9:Debugger encountered an exception: Exception at 0x7fffff3ba7e8, code: 0xc0000005: read access violation at: 0xffffffffffffffff, flags=0x0

解决方法:

这里的问题是因为多次触发,导致卡住,程序崩到了这里。比如,多次触发鼠标事件(因为graphics的鼠标事件可以递归传递的),或者是在基类里调了子类导致循环引起的多次触发。

这里我遇到的是,析构问题。在delete线后,线的paint函数里的setPath()导致了这个问题。【就这一句,卡了我好久,谁能想到在这里...】

Bug10:Attempting to add QLayout "" to xxx "widget",which already has a layout

SRCFileTreeView是我在ui里提升过来的,一般提升过来的控件,如果里面不再加控件不需要添加布局。

Bug11: obj LNK2001: 无法解析的外部符号 

情况一:

解决方法:看一下提示的文件名称,进去看一下头文件的宏定义有没有写错,我就是宏定义再复制粘贴替换的时候写错了,重复写了个view导致的。修改成正确的就好了。

可以检查一下文件名有没有写对,之前遇到过在末尾加了空格,半天看不出来。

情况二:动态编译导出宏错误

解决方法:主要看pro文件。

看一下下面几个名字是否一致

一致后再看下对应pro文件添加的lib名是否与上面一致,然后看引用的库名字有没有错误。

情况三:嵌套编译

这里再编译绿色框文件的时候,头文件里引用一个后编译的文件(红框),就会出现嵌套编译,调用还没有被编译的文件导致错误。

情况四:pro文件错误

我的pro文件里少了else,天哪,这么一下小问题愣是看不出。

Bug12:error: C1083: 无法打开包括文件: “xxx.h”: No such file or directory

问题背景: 我在插件A中用了B.h文件中,在写B.h时引用了C.h文件。报错为C.h中无法打开D.h文件(D.h为静态链接中的文件)。

问题分析:因为是在.h中引用,所以会存在展开。也就是在插件A中找不到D.h。如果是在.cpp中引用是不会有问题的。

解决方法:

法一:在插件A中添加D文件的静态链接

即在插件A的.pro文件中添加 #include(../xxx/D的库名.pri)

法二:在B.h文件中添加前置类,即不使用C.h而使用class C;然后再B.cpp中使用C.h。

Bug13:qt启动慢且无响应,任务管理器显示在后台运行,但qt界面就是没出来,出现界面后点击无响应。

问题背景:我本地装了3个版本的qtcreator,经常会混着开。

问题分析:Qt Creator新的和旧的版本都有,出现了缓存问题。

解决方法:删除如下目录所有东西,就解决了无响应启动慢还有没有可用构建设置的问题

C:\Users\Administrator\AppData\Roaming\QtProject

C:\Users\Administrator\AppData\Local\QtProject

Bug14:提示在线程0中停止,因为: Exception at 0x7fff3e483a7a, code: 0xc0000409: , flags=0x1 (execution cannot be continued) 或者 QWidget: Cannot create a QWidget without QApplication

问题背景:在别人的源码中提取我需要的部分,然后允许是在new一个类的时候报错。


Problem1:运行显示先后问题

问题概述:
简单来说就是运行代码后,是先显示ui,还是先执行函数。有些必须要先等ui显示出来后,才能调用函数传递参数。

举例:
在多层嵌套的管理里,如A界面的B控件提升为C、C与A中的D控件关联信号槽。写代码的时候,逻辑是C传递信号给A,在A中绑定C和D的信号槽。但在运行时有可能会闪退,原因是A在绑定C和D的信号时,D还没有显示,所以没有办法绑定并发送信号。

解决方法:
先让D显示出来,在执行后面的。

解决思路:

  1. show();
  2. /*执行一次事件循环提前初始化*/
  3. QApplication::processEvents();
  4. /*
  5. * 后面执行需要执行函数
  6. */

Problem2:Qt启动慢问题

问题概述:

启动qtCreator的时候很慢,甚至无响应

问题原因:

本地存在多个版本的qtCreator,然后我又会混着打开(形象的表达就是启动的时候系统不知道启动哪个版本),导致了缓存问题

解决方法:

删除下面两个文件夹(Administrator替换为你自己的用户名)

C:\Users\Administrator\AppData\Roaming\QtProject

C:\Users\Administrator\AppData\Local\QtProject

Problem3:软连接问题(库链接指向错误)

问题概述:
我在项目B代码的时候,复用了项目A代码(里面包含了一个对数据库处理的库,是其他前辈封装好的),我想这偷懒就直接拿来用了,然后我代码里使用这个库链接appStore.db,在qt上跑出来控制台显示的很正常,但是一打包放在云服务器上跑(服务器里已经跑了项目A,项目A链接的是script.db),运行出来的总是链接向了script.db,而且我加输出也一个没有显示。

解决过程:

 一开始我想是不是因为项目A在服务器上跑着,所以项目B只能连向A链接的数据库,然后我把A项目kill了,但依旧还是指向script.db,而且我改了A的代码,把A指向appStore.db然后把执行文件打包在服务器上运行,结果也指向script.db!看起来就像这两个项目都指向了一个不知道在那里的库,然后这个库还不跟着我打包的版本变化(突破口啊!!家人们)。然后我就去看两个执行文件的库连接,发现两个项目的数据库链接都指向了/usr/local/lib里的libRoSqlite.so.1(!!!!!!就是这个)这个库是我根据我之前写一篇博客的方法一的第7点放进去的(就是这篇Qt+Ubuntu20.04:打包qt_ubuntu qt程序打包-CSDN博客,这个方法一就是个坑哇)然后就是libRoSqlite.so.1这个文件是项目A的RoSqlite.pro编译出来的,然后我复用的时候又偷懒没有给这个文件改名字(家人们不能偷懒啊!!!!!!)

解决方法:

最后是我把项目B的RoSqlite文件夹里所有的文件都重命名了(记得宏定义也要),改成了RoSqlite2(哈哈哈,又偷懒了)记得.pro的编译出来的库名称也要改。然后重写编译这个文件,这个时候本地的项目bin里编译出来的库名字就变了(原来的是这个)然后把重写编出来的项目B再打包安装到服务器上,下一步很重要,把安装进去的libRoSqlite2.so.1库放到/usr/local/lib里,这个时候再去看两个项目的软连接,就不是指向同一个了,编译也就正常了!

实用代码:

 ldd xxx(你的项目路径,例如/opt/appStore/AppStore,AppStore是我的项目可执行文件)

会显示你的项目链接的库,找到你出错的库,看链接到哪里去了

  1. //移动库到指定位置
  2. cp /opt/appStore/libRoSqlite2.so.1(填你自己的库位置) /usr/local/lib/
  3. //因为我修改了/etc/ld.so.conf文件,将库链接指向了/usr/local/lib/,所以要用下面的命令使修改生效
  4. ldconfig

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/904339
推荐阅读
相关标签
  

闽ICP备14008679号