qt界面不动,但是响应事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt界面不动,但是响应事件相关的知识,希望对你有一定的参考价值。

无响应情况的发生与QT版本(本noob使用的Qt Creator 4.8.0 (Enterprise))无关,在QT使用时突然发作。
表现为内存占用不断上升,直至到达内存上限后QT闪退123
结合广大博友的相似案例,以及自己成功的解决方案,初步判断为QT无响应和显卡/显示驱动/其他软件的进程干涉有关。
解决方案

显卡问题
运行QtCreator的时候不支持某些显卡或者不支持高性能图形处理器
方法1(笔记本适用,台式PC可能不行)

你使用的独立显卡有可能不兼容QT,首选图形处理器选择为自动选择或者集成图形
引用来自https://blog.csdn.net/Hxj_CSDN/article/details/80630420的图片

方法2(适用不存在上述方法的首选图形处理器选项的台式PC)

inter i系列cpu自带集成显示处理。所以直接禁用独立显卡便可以切换成集成图形。
在这里插入图片描述
显卡驱动原因

想一想最近有没有更新显卡驱动或者安装NVIDIA相关驱动(如 3D vision)
将其卸载安装旧稳定版本显卡驱动,或者卸载3D vision
其他软件进程的干涉(如HOOK)

已知有道词典的划词取词功能(可能是用了信息钩子)会导致QT无响应的BUG。
1还有可能是上层屏幕显示的软件导致QT无响应。
请尽量关闭其他软件进程,再重新进入QT排除原因。如果实锤了,那当然就不能同时使用了!
其他可能的解决办法

删除 ~\AppData\Roaming\QtProject文件夹,然后再打开Qt Creator即可。
该文件夹经本noob的试验是用于存储QT个人设置以及历史项目目录等文件的,大可删除,QT会在重新打开时自动生成,只不过你相关的设置就会恢复默认值了!!!
Linux下,~是/home/YourUserName
Windows下,~是C:\Users\YourUserName
参考技术A 在Qt程序中,我们有时候会遇到这样的需求,比如让程序暂停(休息、休眠)一段时间, 这段时间里可能程序什么都不做, 也可能是在后台开了个子线程在做一些用户看不见的工作。

最开始我需要这样的需求时候,我第一反应想到的是在QT Assistant 中搜索sleep方法,企图寻找让程序暂停、休眠一段时间的方法,不过,搜索结果显然令我很失望,并没有找到直接满足需求的sleep方法,不过看到了QThread中的sleep的方法:

[static] void QThread::sleep(unsigned long secs);//Forces the current thread to sleep for secs seconds.
这个好像和我们的需求类似,就试一下吧。

QThread::sleep(5000);
好吧,结果却是下面这样,也就是程序直接崩溃了。

究其原因:

原来界面的线程是主线程,在主线程中使用休眠函数是一种错误,这会直接导致界面无法刷新,用户与程序无法交互,最终导致程序崩溃。linux提供的”sleep”或”usleep”函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用sleep函数睡眠是常见的错误方案之一。
多线程程序使用sleep()、msleep()、usleep()、wait()进行延时处理。Sleep不会释放对象锁,其他线程无法访问对象,因此会阻塞线程;而Wait会释放对象锁,使得其他线程能够访问该对象。
我们要记住最重要的一点:我们永远不需要让主线程休眠,但是,我们有时候会需要让程序等一段时间。

以上是关于qt界面不动,但是响应事件的主要内容,如果未能解决你的问题,请参考以下文章

关于Qt5-- 两个窗口互相切换的例子

QT Designer 菜单栏事件响应问题。

Qt学习笔记8.Qt中的多线程

Qt自定义界面边框后,移动鼠标拖动界面,界面会拖到任务栏以下。。。如何解决?

mfc中嵌套qt,qt动态库里面用QAxwidget加载html网页后,qt界面非常卡

qt中handler的定义