赞
踩
目录
Bug4:使用dynamic_cast时提示dynamic_cast的目标类型无效
Bug5:提示非标准语法;请使用 "&" 来创建指向成员的指针
Bug10:Attempting to add QLayout "" to xxx "widget",which already has a layout
Bug12:error: C1083: 无法打开包括文件: “xxx.h”: No such file or directory
Bug13:qt启动慢且无响应,任务管理器显示在后台运行,但qt界面就是没出来,出现界面后点击无响应。
解决方法
这个问题是函数作用域问题。因为我定义的undoMap和redoMap在connect外部,而我在connect里调用了undoMap。只需要将定于移到connect里即可。
解决方法
这个提示看似是连接数超了,其实是因为调用到的函数头文件中的#ifndef 和 #define没有修改(就是函数写的时候为了偷懒直接复制了其他的头文件,但是没有修改#ifndef 和#define,导致了重复,让程序在找这个函数的时候没找到)。
解决方法
Debug时发现在push(cmd)这里出错了。发现是因为没有new undoStack()就直接调用了。
在Scene界面new一下即可。
解决方法
添加转换类型的头文件。
比如,图中的错误,添加头文件
#include "GroupItem.h"
#include "BaseNodeItem.h" 即可解决问题。
【注意】在调用其他类的时候,发现无法使用对应类的方法,可以看看是不是忘记加头文件了。
解决方法:
该提示表明在调用成员函数的函数没有添加()
这里只需要把第二个getScene改为getScene(),即可通过。
解决方法:
情况一:先new,再connect
指针为空,指针没指向对象,需要进行初始化才可以
1.指针new的对象在其connect之后
2.指针并未new出对象
情况二:将connect写到其他地方
这里遇到的就是情况二,我在初始化的时候使用connect,想让view获取scene传来的参数,但是因为初始化时还没有scene所以提示为空。在view里找一个函数,先对scene判空一下,再使用connect更为保险。
这个两种报错的实质是一样的。即传入是指针,接收变量没有 星号(*) 。
解决方法
这个问题产生的原因是因为转入的是指针,但是接收的构造函数不是指针,只要在构造对应的变量时添加 * 即可解决。
将BaseObjectItem _nextParent; 改成 BaseObjectItem *_nextParent;
解决方法:
将QGraphicsItem _nextParent; 改成 QGraphicsItem *_nextParent;
解决方法:
修改connect中的[]中的值。
默认捕获模式为[=](按值)和[&](按引用)。 [ ]表示没有捕获。
解决方法:
这里的问题是因为多次触发,导致卡住,程序崩到了这里。比如,多次触发鼠标事件(因为graphics的鼠标事件可以递归传递的),或者是在基类里调了子类导致循环引起的多次触发。
这里我遇到的是,析构问题。在delete线后,线的paint函数里的setPath()导致了这个问题。【就这一句,卡了我好久,谁能想到在这里...】
SRCFileTreeView是我在ui里提升过来的,一般提升过来的控件,如果里面不再加控件不需要添加布局。
解决方法:看一下提示的文件名称,进去看一下头文件的宏定义有没有写错,我就是宏定义再复制粘贴替换的时候写错了,重复写了个view导致的。修改成正确的就好了。
可以检查一下文件名有没有写对,之前遇到过在末尾加了空格,半天看不出来。
、
解决方法:主要看pro文件。
看一下下面几个名字是否一致
一致后再看下对应pro文件添加的lib名是否与上面一致,然后看引用的库名字有没有错误。
这里再编译绿色框文件的时候,头文件里引用一个后编译的文件(红框),就会出现嵌套编译,调用还没有被编译的文件导致错误。
我的pro文件里少了else,天哪,这么一下小问题愣是看不出。
问题背景: 我在插件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。
问题背景:我本地装了3个版本的qtcreator,经常会混着开。
问题分析:Qt Creator新的和旧的版本都有,出现了缓存问题。
解决方法:删除如下目录所有东西,就解决了无响应启动慢还有没有可用构建设置的问题
C:\Users\Administrator\AppData\Roaming\QtProject
C:\Users\Administrator\AppData\Local\QtProject
问题背景:在别人的源码中提取我需要的部分,然后允许是在new一个类的时候报错。
问题概述:
简单来说就是运行代码后,是先显示ui,还是先执行函数。有些必须要先等ui显示出来后,才能调用函数传递参数。
举例:
在多层嵌套的管理里,如A界面的B控件提升为C、C与A中的D控件关联信号槽。写代码的时候,逻辑是C传递信号给A,在A中绑定C和D的信号槽。但在运行时有可能会闪退,原因是A在绑定C和D的信号时,D还没有显示,所以没有办法绑定并发送信号。
解决方法:
先让D显示出来,在执行后面的。
解决思路:
- show();
-
- /*执行一次事件循环提前初始化*/
- QApplication::processEvents();
-
- /*
- * 后面执行需要执行函数
- */
问题概述:
启动qtCreator的时候很慢,甚至无响应
问题原因:
本地存在多个版本的qtCreator,然后我又会混着打开(形象的表达就是启动的时候系统不知道启动哪个版本),导致了缓存问题
解决方法:
删除下面两个文件夹(Administrator替换为你自己的用户名)
C:\Users\Administrator\AppData\Roaming\QtProject
C:\Users\Administrator\AppData\Local\QtProject
问题概述:
我在项目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是我的项目可执行文件)
会显示你的项目链接的库,找到你出错的库,看链接到哪里去了
- //移动库到指定位置
- cp /opt/appStore/libRoSqlite2.so.1(填你自己的库位置) /usr/local/lib/
-
-
- //因为我修改了/etc/ld.so.conf文件,将库链接指向了/usr/local/lib/,所以要用下面的命令使修改生效
- ldconfig
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。