目录
一、运行显示先后问题
问题概述:
简单来说就是运行代码后,是先显示ui,还是先执行函数。有些必须要先等ui显示出来后,才能调用函数传递参数。
举例:
在多层嵌套的管理里,如A界面的B控件提升为C、C与A中的D控件关联信号槽。写代码的时候,逻辑是C传递信号给A,在A中绑定C和D的信号槽。但在运行时有可能会闪退,原因是A在绑定C和D的信号时,D还没有显示,所以没有办法绑定并发送信号。
解决方法:
先让D显示出来,在执行后面的。
解决思路:
show();
/*执行一次事件循环提前初始化*/
QApplication::processEvents();
/*
* 后面执行需要执行函数
*/
二、软连接问题(库链接指向错误)
问题概述:
我在项目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