Q_ASSERT failed in qt_win_display_dc()

为什么将 browseBtn 的父对象设置为 this 可以解决 Q_ASSERT(c->sender == q_ptr) 的问题。 通过将browseBtn的父对象设置为this,可以确保其生命周期与MainWidget一致,避免悬挂指针和内存泄漏问题。这是 Qt 编程中的一种良好实践,可以提高代码的稳定性和可维护性。那为什么某些按钮需要显式设置父对象,而其他按钮不需要?在 Qt 中,是否需要显式设置父对象取决于对象的创建和管理方式。布局管理器自动设置父对象:如果你将控件添加到布局中,通常不需要显式设置父对象。显式设置父对象。 阅读详情

在Qt中编程调试时有时会发生一个奇怪的错误,在qt_win_display_dc()函数中会发生Assert Failed,导致程序崩溃。该函数的代码如下:

Q_GUI_EXPORT HDC qt_win_display_dc()                  // get display DC
{
    Q_ASSERT(qApp && qApp->thread() == QThread::currentThread());
    if (!displayDC)
        displayDC = GetDC(0);
    return displayDC;
} 
Assert所判断的意思是当前运行的线程不是程序的主线程,也就是Qt中认为这段程序应该在主线程中执行才可以。最后知道是在其他的线程中要调用字体显示方面的函数,才导致这里的异常。

也有人说可以将这句Assert注释掉在编译Qt的源码来解决该问题,但是个人觉得既然源程序中这么写总是有原因的,简单的去掉这个Assert可能会造成其他的未知错误。所以还是从程序结构上来考虑如何避免该操作。

在Qt的文档中有这样的一些说明,摘录如下供参考。

In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations.

Although QObject is reentrant, the GUI classes, notably QWidget and all its subclasses, are not reentrant. They can only be used from the main thread.

As mentioned, each program has one thread when it is started. This thread is called the "main thread" (also known as the "GUI thread" in Qt applications). The Qt GUI must run in this thread. All widgets and several related classes, for example QPixmap, don't work in secondary threads. A secondary thread is commonly referred to as a "worker thread" because it is used to offload processing work from the main thread.

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级 本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。 阅读详情

相关推荐

Vienna整流器双PI闭环仿真:从SVPWM调制到中点电位平衡的实践解析

本文深入解析Vienna整流器双PI闭环仿真技术,涵盖SVPWM调制和中点电位平衡的实践细节。通过详细的MATLAB/Simulink仿真搭建流程和常见问题排查方法,帮助工程师掌握高效整流器控制策略,提升系统稳定性和动态响应性能。

weixin_29168153的博客 327

【Qt】断言Q_ASSERT的使用

半路出家,总是有太多东西需要学习,有太多问题需要解决。 ——【Y忍冬草】 最近在写完项目软件后,虽然对于测试出的问题都很好的解决,但是总纠结于发布后出现问题怎么办?就查看了一些关于断言和异常处理的方法。 ———以下为摘录自博友 在使用Qt开发大型软件时,需要对程序进行调试,以确保程序内的运算结果符合我们的预期。在不符合预期结果时,就直接将程序断下,以便修改。 assert()是一...

Y忍冬草 9557

告别密码明文传输:手把手带你用Python实现SRP-6协议(附完整代码)

本文详细介绍了如何使用Python实现SRP-6协议,确保密码安全传输和存储。通过零知识证明与密钥交换技术,SRP协议在不传输明文密码的情况下完成认证,适用于金融App等高安全需求场景。文章包含完整代码示例和实战技巧,帮助开发者规避常见安全陷阱。

weixin_30689307的博客 412

Q_ASSERT的详细介绍

需要注意的是, Q_ASSERT 宏只在调试版本中起作用,即在使用 Qt 的 Debug 版本编译程序时才会执行。在使用 Qt 的 Release 版本编译程序时, Q_ASSERT 宏会被编译器优化掉,不会产生任何代码。在上面的错误信息中,"main.cpp" 表示错误发生的源文件,"10" 表示错误发生的行号,"i == 0" 表示检查的条件表达式。在编写程序时,可以使用这些断言宏来检查程序的正确性,帮助发现潜在的错误。Q_ASSERT 是 Qt 中的一个宏,用于在调试时检查某个条件是否为真。

future_ai的博客 3197

VMware Workstation Pro 17 最新破解版安装教程(附永久激活密钥)

本文详细介绍了VMware Workstation Pro 17专业版的安装与配置指南,包括系统要求检查、官方版本安装流程、高级配置优化及常见问题排查。通过合规使用官方版本,开发者可以充分利用其强大的虚拟化能力,提升多平台开发与测试效率。

weixin_29327977的博客 3557

ABB RobotStudio 和 S7-PLCSIM Advanced V5.0 搭建虚拟通信环境,实现 PLC 对机器人布尔量、数字量和模拟量的控制。

本教程详细介绍了如何利用ABB RobotStudio和S7-PLCSIM Advanced V5.0搭建虚拟通信环境,实现PLC对机器人的布尔量、数字量和模拟量控制。主要内容包括:在TIA Portal V20中配置PLC项目并编写通信程序;通过S7-PLCSIM Advanced创建虚拟PLC运行环境;在RobotStudio中设置机器人PROFINET通信;以及建立虚拟网络连接并进行功能测试。该方案适用于工业自动化虚拟调试,可显著降低现场调试风险。操作需注意软件版本兼容性、网络配置及信号映射准确性,最

CHUXUEZHE8210的博客 2515

Qt Q_ASSERT详解

`Q_ASSERT`是 Qt 框架中的一个宏,用于在调试时检查某个条件是否为真。它是程序调试中的一个重要工具,有助于开发者在开发过程中及时发现并修复潜在的错误。

做减求空 2239

Simulink封装与库的建立

第二栏设置标签,第三栏是对应变量名,即是第一张图中的常量名。1.先将输入与常量模块相连接并生成子系统。按照如图所示添加修改,最后的效果如下图。封装子系统搭建测试环境。

lensyu1994的博客 1742

Qt 断言的使用 Q_ASSERT

前言 在写代码的时候,难免会调试程序,确保某一个语句或运算结果符合预期,如果不是的话就将程序暂停,便于修改,那么这时候就要用到一个Qt 中的调试神器—Q_ASSERT(断言)。 所谓的断言,其实很简单,它是一个宏定义,接受一个布尔值,当判断的语句为真时,不做任何操作,如果判断的语句为假,那么在 debug 模式下程序运行到该地方会自动断下,并弹出一个系统消息框,并且在程序输出栏会打印出断言的位...

luoyayun361的专栏 1万+

从零开始训练一个简单的CLIP

到这里,你已经基本了解了CLIP的基本原理,并且能够自己动手训练一个简单的CLIP模型。整体上来看,代码比较简单,但是已经基本覆盖到CLIP的整体训练流程了。另外,如果需要实际的落地,建议还是使用openclip等更加成熟的框架。欢迎关注github:https://github.com/taishan1994。

u012374012的专栏 2912

Ubuntu系统等保3级配置核查与加固

虽然这种方法在某些老旧的系统中仍然有效,但现代Linux发行版通常不推荐使用hosts.deny和hosts.allow文件来管理防火墙规则,因为它们的功能已经被更现代的防火墙管理工具(如iptables或firewalld)所取代。如果你想禁止特定的环境变量,可以从这个列表中移除它们,或者如果你想完全阻止所有环境变量的传递,可以将其设置为空。你可以通过ssh-keygen生成密钥对,并将公钥添加到用户的~/.ssh/authorized_keys文件中。修改配置后,需要重启SSH服务以使更改生效。

悦分享 183

Qt常用的部件及相关函数

Qwidget类: setEnabled(bool)控制使能 setDisabled(bool)输入使能 width() 窗口宽度 height()窗口高度 close()关闭 show()显示 hide()隐藏   QFont类: QFont font("Helvetica",12,QFont::Bold) setFont(font) 字体设置方式 QLcdNumbe

xingyuan1hao的专栏 720

【华为OD机试真题】439、精准核酸检测 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。现在给定一组确诊人品编号(X1 X2 X3.....n)在所有人当中,找出哪些人票要进行核酸检测,输出需要进行核酸检测的人数。(注意:确诊病例自身不需要再做核酸检) >  需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人   例如:A是确诊病例,A和B有接触、B和

KJ.JK 1434

QT (windows桌面)共享屏幕并抓取鼠标

源码链接:https://pan.baidu.com/s/1kDbq0CuZ7ivfDfMURBJLrQ 提取码:gxrj #include "windows.h" HWND hwndReceive = (HWND)QApplication::desktop()->winId(); QPixmap pix = gr(hwndReceive); //获取鼠标至桌面截图 //保存图片 QByteArray tempdata; QBuffer picbuf(&p

ztq_12345的博客 1417

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Qt内嵌外部exe程序 利用Windows API(3) 报错 assert:result.hwnd in file qwindowswindow.cpp line 596

assert:result.hwnd in file qwindowswindow.cpp line 596 问题 内嵌mfc程序时,能将mfc的exe程序调起,但无法内嵌,同时弹出提示框报错: assert:result.hwnd in file qwindowswindow.cpp line 596。 解决办法 打开对话框属性,如下,可以看到Bolder为None,Caption为不可编辑。 更改对话框属性,Bolder栏下拉选择Dialog Frame,然后填写Caption,和抓起的句柄保持一致。

qq_36103026的博客 494

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

使用Qt在Windows下进行截屏的一些尝试

【写在前面】 最近在尝试做一个简单的屏幕控制,本以为截屏应该是最简单的部分,没想到在 windows 下有很大的问题。 其中主要的问题在于截屏效率,查了很多资料以后发现巨多坑。 本篇只讲几种截屏的方式,不讲屏幕控制(因为比起截屏反而是很简单的部分)。 【正文开始】 1、首先,因为使用的Qt,立即能想到的截屏方式是: QPixmap pixmap = QGuiApplicat...

梦起丶的博客 5519

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Qt文档阅读笔记-Q_ASSERT的另外一总用法(大佬用法)

刚刚看到文档里面有个Q_ASSERT,好玩的用法! 普通人的用法如下: #include <QApplication> #include <QGraphicsLineItem> #include <QGraphicsDropShadowEffect> #include <QDebug> #include <QList> int m...

IT1995的博客 4807

qt中Q_ASSERT的使用

以下内容是参考博客:https://blog.youkuaiyun.com/luoyayun361/article/details/80248181 以下内容是摘抄以上博主的博客来进行分析的: 在qt中有时候遇到问题,比较难定位的时候,就需要我们增加个断言来定位: 含义: 在写代码的时候,难免会调试程序,确保某一个语句或运算结果符合预期,如果不是的话就将程序暂停,便于修改,那么这时候就要用到一个Qt 中的调试神器—Q_ASSERT(断言)。 所谓的断言,其实很简单,它是一个宏定义,接受一个布尔值,当判断的语句为

Littlehero_121的博客 995

windows 下使用Qt抓取桌面和鼠标

QPixmap MainWindow::grabWindow(HWND winId, int x, int y, int w, int h) { RECT r; GetClientRect(winId, &r); if (w < 0) w = r.right - r.left; if (h < 0) h = r.bottom - r.top; HDC display_dc = GetDC(winId); HDC bitmap_dc = CreateComp

qq_28581781的博客 3325

!strcmp(locale, "C"):Error:Assert failed:in file baseapi.cpp, line 209 Illegal instruction: 4

调用tesserocr 出现这个问题 !strcmp(locale, "C"):Error:Assert failed:in file baseapi.cpp, line 209 Illegal instruction: 4 在进入python3前输入以下命令行 export LC_ALL=C 然后再进入python3就可以正常调用了 ...

郑王铭 2003

qt ASSERT: "dst.depth() == 32" in file qgl.cpp, line 2096

在编写 QT opengl 纹理映射的时候出现这个错误,编译什么的都通过了,

u014221838的专栏 2368

hi3515 QT设置环境变量QWS_DISPLAY

当应用程序./myQtApp -qws启动时,会去检测QWS_DISPLAY这个环境变量, 判断界面最终显示在哪个framebuffer中, 如果是虚拟的framebuffer(qvfb,x86),则分两种情况: 1.显示在远程计算机上 QWS_DISPLAY=192.168.1.1:0 指定了要显示的目的机器的ip地址 2.显示在本机上 QWS_DISP

godcyx的专栏 5956

QT 函数(全)

/*****************Qt显示中文(主要在main函数实现)***************************/  #include    // 编码头文件  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb18030")); // 窗口里面可以接收或写中文文字  // 这个和上面那个是等级的 QTex

Fire_For_Code 9068

QMutex出现——ASSERT: “copy“ in file thread\qmutex.cpp, line 606 的问题,程序异常结束

QMutex出现——ASSERT: “copy” in file thread\qmutex.cpp, line 606 的问题,程序异常结束。这是由于mutex没有lock之前调用了unlock,导致操作的条件不符合,就出现了这个问题,该问题出现在程序运行过程中,编译没有提示。...

Rough Set 1858

assert

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:  #include   void assert( int expression );  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,  然后通过调用 abort 来终止程序运行。  请看下面的程序清单badptr.c: 

东川 6147
上一篇: 打印机使用的驱动语言
下一篇: Qt多线程编程中的对象线程与函数执行线程
Lutx
博客等级 码龄25年 50粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值