Qt之碰过的小问题

目录

1、由于找不到xxx.dll,无法继续执行代码...

2、提示Read-only file system

3、Qt之qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt5/bin/qmake': No such file or directory

4、fatal error: GL/glew.h: 没有那个文件或目录

5、qt5 cannot find -lGL解决方法

6、Creating qmake... .make: g++:命令未找到 make: *** [project.o] 错误 127

7、arm-none-linux-gnueabi-: not found 的解决办法

8、提示warning : Z-order assignment

9、QMetaObject::connectSlotsByName: No matching signal for问题的解决方法

10、QThread: Destroyed while thread is still running错误解决方法

11、程序编译的时候报错prototype for '类名::函数名'does not match any in class'类名'

12、Qt程序启动错误:during startup program exited with code

13、提示warning: operation on ‘i’ may be undefined

14、No rule to make target '../../mkspecs/default/qmake.conf', needed by `Makefile'. Stop.

15、Cannot create file .pro.user: Permission denied

16、make: *** 警告:文件“xxx.c”的修改时间在将来 make警告:检测到时钟错误,您的创建可能是不完整的

17、出错member access into incomplete type

18、qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization faile


1、由于找不到xxx.dll,无法继续执行代码...

原因:没有相应的动态库文件

解决方法:此时需要在Path变量下添加dll动态库的路径,在计算机->属性->环境变量->path下添加自己Qt的bin目录路径

2、提示Read-only file system

解决方法:mount -o remount rw / 一劳永逸,但是不安全,推荐使用 wr vi start.sh,加上wr就可以修改

3、Qt之qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt5/bin/qmake': No such file or directory

原因:使用指令 qmake -v 查询所安装的Qt版本qtchooser默认选择路径中没有指向qmake路径(qt4中没有qmake文件,但是qt5中有的)

解决办法: 将/usr/lib/x86_64-linux-gnu/qt-default/qtchoooster的default.conf文件中的第一行改为:自己生成的qt源文件目录下的bin路径比如我就是/opt/Qt5.7.1/5.7/gcc_64/bin

4、fatal error: GL/glew.h: 没有那个文件或目录

解决方法:

apt-cache search glew
libglew-dbg - OpenGL Extension Wrangler (debugging symbols)
libglew-dev - OpenGL Extension Wrangler - development environment
libglew1.13 - OpenGL Extension Wrangler - runtime environment
libglewmx-dbg - OpenGL Extension Wrangler MX (debugging symbols)
libglewmx-dev - OpenGL Extension Wrangler MX - development environment
libglewmx1.13 - OpenGL Extension Wrangler (Multiple Rendering Contexts)
glew-utils - OpenGL Extension Wrangler - utilities

sudo apt-get install libglew-dbg libglew-dev libglew1.10 libglewmx-dbg libglewmx-dev libglewmx1.13 glew-utils

5、qt5 cannot find -lGL解决方法

原因:没有安装libGL

解决方法:

$sudo apt-get install build-essential 
$sudo apt-get install libgl1-mesa-dev

6、Creating qmake... .make: g++:命令未找到 make: *** [project.o] 错误 127

sudo apt-get install g++

7、arm-none-linux-gnueabi-: not found 的解决办法

这是因为你是64位系统不支持32位的库,所以你要下载,但是你下载的时候如果一直apt-get install libc6-i386不成功,那么你试什么命令都没用,你要:

1、打开系统设置->软件和更新->更新->重要更新和安全更新勾选起来,然后重新载入,再运行apt-get update

2、apt-get install libc6-i386

8、提示warning : Z-order assignment

例如

Qt中调整UI布局的时候,很容易出现如下警告:

warning : Z-order assignment: '' is not a valid widget.
warning : Z-order assignment: 'verticalSpacer' is not a valid widget.
 用文本编辑器(记事本,ultraedit, notepad++等)打开刚才布局的ui文件; 
* 找到里面的zroder行删除对应警告的就行了,如:

        <zorder>label_7</zorder>
        <zorder>checkBox</zorder>
        <zorder>checkBox_2</zorder>
        <zorder>comboBox</zorder>
        <zorder></zorder>
        <zorder></zorder>
        <zorder>verticalSpacer</zorder>

9、QMetaObject::connectSlotsByName: No matching signal for问题的解决方法

原因:用VistalStudio里的QtEditer可以自动调用Qt中“connectSlotsByName”即“按空间名称关联槽”的方式进行关 联,对应的函数必须写成“on_控件名_信号名”的格式;或者也可以通过connet函数人为显式地将信号和槽关联起来。但是,如果采用显式connect的方法的同时,又将槽函数的名字起成了“on_控件名_信号名”的格式,那么就会在运行时弹出 “QMetaObject::connectSlotsByName: No matching signal for”的警告了!

解决方法:

尽量不要让QObject出现相同objectName的情况 
如果同名connectSlotsByName只能给其中一个建立缺省的信号和槽的连接 
如果出现大量编码创建大量控件的情况,最好是自己去建立信号和槽的连接,而不是依赖connectSlotsByName来做到这个工作。connectSlotsByName更适合的任务是与desinger配合完成缺省的信号和槽的连接。 
 

10、QThread: Destroyed while thread is still running错误解决方法

如果一个线程运行完成,就会结束。可很多情况并非这么简单,由于某种特殊原因,当线程还未执行完时,我们就想中止它。不恰当的中止往往会引起一些未知错误。比如:当关闭主界面的时候,很有可能次线程正在运行,这时,就会出现如题提示。

解决方法:
第一种方法调用wait();
第二种方法:将线程定义为全局即可

11、程序编译的时候报错prototype for '类名::函数名'does not match any in class'类名'

其实就是函数内 调用了一个没有声明的函数 。自己仔细看看你代码是不是修改了函数名修改后这个 bug 就没了。

12、Qt程序启动错误:during startup program exited with code

排除qt本身的原因的情况下,大部分的原因都是因为你在pro文件中添加了Lib的依赖项,但是你生成程序的目录内没有对应的dll文件导致。将dll文件使用复制到qt的build文件夹下或者取消勾选shadow build,直接在当前文件夹生成,程序正常启动了。

13、提示warning: operation on ‘i’ may be undefined

dest[i++]=src[i];

这行代码,编译时会遇到警告:
warning: operation on ‘i’ may be undefined(对于i变量的操作,有可能是未定义的)
改成
i++;
dest[i] = src[i];
则警告消失。Qt4里自增和赋值不能同时出现

14、No rule to make target '../../mkspecs/default/qmake.conf', needed by `Makefile'. Stop.

这个错误是说缺少Makefile,用qmake *.pro命令生成一个Makefile就行

15、Cannot create file .pro.user: Permission denied

原因:复制,移动你的文件目录之后,再次打开出现的情况

解决方法:sudo chmod 777 + 文件 -R(这是你复制移动之后的目录)

16、make: *** 警告:文件“xxx.c”的修改时间在将来 make警告:检测到时钟错误,您的创建可能是不完整的

原因:因为你那服务器上的文件最后修改时间比当前时钟还要晚。
解决方法:

touch *
find ./ -type f |xargs touch

17、出错member access into incomplete type

有四个文件demoA.h, demoA.cpp, demoB.h, demoB.cpp。
在demoA.h中有一个类为class demoA, 在demoB.h中有一个类为class demoB。
如果demoA类要用到demoB类,并且demoB类也要用到demoA类,那么必须要如下:
1、在demoA类的cpp文件中包含demoB类的头文件路径;
2、在demoB类的h文件中加Class demoA,同时也要在demoB类的cpp文件中添加demoA类的头文件路径;
// demoA.h
class demoA{demoB * b;};
// demoA.cpp
#include "demoB.h" 
// demoB.h
class demoA;
class demoB{demoA * parent;};
// demoB.cpp
#include "demoA.h"

这样就好了。
如果在demoB.cpp中没有加入demoA.h,那么会报错:member access into incomplete type

18、qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization faile

输出当前QT支持的openSSL版本

 qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();
 判断系统是否支持OpenSSL
 如果此平台支持SSL,则返回true; 否则,返回false。 如果平台不支持SSL,则套接字将在连接阶段失败。不支持就需要看下面的解决方法。
qDebug() << "OpenSSL支持情况:" << QSslSocket::supportsSsl();

解决办法:

openssl下载地址:http://slproweb.com/products/Win32OpenSSL.html
根据自己使用的QT编译器时32位还是64位,对应下载安装包。

将下载的安装包进行安装,安装到第二个选项时,选择安装到指定的/bin目录下

安装之后,找到安装目录下的两个文件(libcrypto-1_1.dll 和libssl-1_1.dll),拷贝到QT编译器目录下即可

19、QObject::startTimer: Timers cannot be started from another thread

原因:例如继承类的线程函数,只有run是运行在新线程的,如果在其中使用了定时器,那么创建和调用并不是在同一线程中,所以出现了错误。
Qt使用计时器的线程关系(thread affinity)来决定由哪个线程发出timeout()信号。正因如此,你必须在它所处的线程中start或stop该定时器,在其它线程中启动定时器是不可能的。
解决办法1:
void myClass::run()
{
    myTimer = new QTimer();
    connect(myTimer,&QTimer::timeout,this,&myClass::checkFun);
    myTimer->start(1000);
    this->exec();
}//其实这个办法很不好,还不如直接sleep(1),将定时器函数中的内容搬到run中运行
解决办法2:
moveToThread()方法

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值