Qt笔记7--Qt 常见问题汇总
最近由于需要又把Qt给捡回来了,然而发现曾经的点点滴滴都所剩无几了,因此觉得有必要逐渐写几篇博文,专门用来记录曾经、当下和以后会遇见的问题,以便于后续查阅。
1、配置及使用
1.1、debain下安装了Qt5.7 运行异常初次安装Qt5.7 提示无 Qt creator needs a compiler set up to build. Configure a compiler in the kit options,此时需要先安装g++:apt install g++
运行时候出现cannot find -IGL问题,解决方法如下:apt-get install libgl1-mesa-dev
默认情况下可能无法获取g++等资源,因此需要先配置ali源(也可以配置其它源),否则无法正常apt到g++。
出现 Could not start process "make"时候,一般可以通过apt install build-essential加以解决。
1.2 Windows下出现 Qt无法定位程序输入点_ZdaPvj*** 的错误
笔者电脑中同时添加了codeblocks和Qt的环境本来,它们会冲突,导致程序无法正常启动,解决方法是将Qt的环境变量路径加在codeblocks的前面,调整顺序后即可正常运行。
1.3 Windows下Qt打包方法
Windows下可以使用Qt自带的windeployqt工具,它在Qt的bin目录下,如果已经将bin目录添加到环境变量,只需使用 windeployqt xxx.exe 即可将所需的依赖文件全部拷贝到exe同一个目录下,然后就可以正常运行exe了。但是实际PC中可能存在不兼容的库,windeployqt直接拷贝了系统环境变量路径中的不兼容版本导致运行失败,如出现“无法启动此程序,因为计算机中丢失 libstdc++-6.dll”,此时需要在Qt的bin目录将该库文件拷贝过来即可。
1.4 Linux下Qt打包方法
方法1:通过ldd直接获取可执行文件xx的依赖文件,然后依次放到xx的同目录下,该方法需要解决文件之间的链接问题,也需要解决not find or load the Qt platform plugin "xcb" 等一系列问题的依赖文件,可以完成Qt文件的打包功能,但是比较复杂、容易出错,笔者配了一个app发了近半天时间,不建议使用该方法;
方法2:通过linuxdeployqt 来实现打包,该方法只需要在 https://github.com/probonopd/linuxdeployqt/releases 下载 linuxdeployqt-continuous-x86_64.AppImage,然后使用linuxdeployqt(此处重命名了) xx即可实现Qt打包功能,打包后拷贝整个文件夹到未安装Qt的linux上即可。若出现:ERROR: "/usr/bin/qmake -query" exited with 1 : "qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory\n" 等qmake相关的错误,则需要配置qmake路径,使用root权限:ln -s ***/Qt5.7/5.7/gcc_64/bin/qmake /usr/lib/x86_64-linux-gnu/qt4/bin/qmake 建立链接即可。 一般应用都可以使用该方法打包,效率非常高,强烈推荐。
参考文献:
Linux 下qt 程序打包发布 : https://blog.youkuaiyun.com/u014746574/article/details/79288727
linuxdeployqt GitHub官网:https://github.com/probonopd/linuxdeployqt
1.5 HTTP get/post出现创建SSL context错误:
笔者执行http的get功能的时候出现如下错误,通过网上查询后发现由缺少libeay32.dll和ssleay32.dll库导致的,因此重新拷贝以上两个库到5.7\mingw53_32\bin目录即可解决该问题。由于在Qt的Tools\mingw530_32\opt\bin目录下已经存在以上两个dll,所以直接拷贝过来即可使用。
Error creating SSL context ()
qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
request protobufHttp handle errors here
request protobufHttp found error ....code: 0 99
参考文献:
Qt 5.4错误"qt.network.ssl: QSslSocket: cannot call":https://www.cnblogs.com/totogo/p/6873392.html
1.6 Qt QMetaObject::connectSlotsByName: No matching signal for ***异常解决方法
Qt的信号和槽有两种关联方式;第一种为UI界面右键控件后自动通过Go to slot...的方式关联信号和槽,该方式特点为 在private slots下面多出来void on_控件名称_触发方式()的函数,如void on_pushButton_1_clicked();第二种为通过connect手动关联信号和槽,需要自定义slot函数,该函数命名不要以on_开头,否则会触发以上异常。
参考文献:
QMetaObject::connectSlotsByName: No matching signal for问题的解决方法:https://blog.youkuaiyun.com/restraint/article/details/9956449
2、常见功能
2.1 Qt 操作 Json
Qt 笔记2--Qt 操作 Json : https://blog.youkuaiyun.com/u011127242/article/details/88768252
2.2 Qt 操作 XML
Qt 笔记3--Qt 操作 XML : https://blog.youkuaiyun.com/u011127242/article/details/88779457
2.3 Qt 读写CSV
Qt 笔记4--Qt 读写CSV : https://blog.youkuaiyun.com/u011127242/article/details/89335518
2.4 Qt 拷贝文件夹
Qt默认没有提供文件夹拷贝函数,也没有提供linux下的mv功能函数,因此需要自己实现,其思路为:依次遍历源文件夹,并在目的路径下创建相应的文件夹,同时将文件依次拷贝到对应的路径中,拷贝完后可根据需要确定是否删除源文件夹,实现代码如下:
void ThreadClass::copyDir(QString OriDir, QString DesDir)
{
/*
* 将OriDir文件夹拷贝到DesDir目录
*/
QDir tmpDir;
if(!tmpDir.exists(DesDir))
{
tmpDir.mkdir(DesDir);
}
tmpDir.cd(OriDir);
QFileInfoList DirList = tmpDir.entryInfoList();
for(int i=0;i<DirList.size();i++)
{
//qDebug().noquote()<<DirList.at(i).fileName();
if((DirList.at(i).fileName()!="." && DirList.at(i).fileName()!="..") && DirList.at(i).isDir()){
copyDir(OriDir+'/'+DirList.at(i).fileName(),DesDir+'/'+DirList.at(i).fileName());
}
if(DirList.at(i).isFile()){
QFile::copy(OriDir+'/'+DirList.at(i).fileName(),DesDir+'/'+DirList.at(i).fileName());
}
}
}
2.5 Qt打开子窗口的时候无法单击父窗口
正常情况下通过自窗口的show弹出子窗口后,父子窗口可以切换单击;若打开子窗口时候需要禁止父窗口的单击工具,只有当子窗口关闭后才能单击父窗口,此时需要设置子窗口的windowModality属性,在UI界面设置为ApplicationModal即可。
参考文献:
Qt自定义样式/无边框窗口/子窗口模态/非模态问题:https://blog.youkuaiyun.com/xbnlkdbxl/article/details/51443390
2.6 Qt获取操作系统信息
QSysInfo 用于获取操作系统信息,其中QSysInfo::productType()可获取系统类型(如windows),QSysInfo::productVersion()可获取系统详细版本(如10)
此部分后续将逐渐添加多个小功能!
3、说明
笔者默认Windows测试系统为Win7/Win10、Qt5.7,默认Linux测试系统为Ubuntu/Debian、Qt5.7,特殊应用一般以介绍中的系统/软件版本为主!