Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们

Posted

技术标签:

【中文标题】Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们【英文标题】:Errors showing in Qt application - how to not display them in Release 【发布时间】:2014-09-22 21:29:50 【问题描述】:

一个 Qt 项目给出了一些错误——我实际上并没有考虑到我认为的错误:

一些例子:

Fontconfig error: "/etc/fonts/conf.d/65-khmer.conf", line 32: out of memory
  // ? 
QGraphicsItem::ungrabMouse: not a mouse grabber 
  // i think happens when the mouse grab didn't quite happen, user moved too fast...

其他几个

第一个似乎在这里有答案https://askubuntu.com/questions/421891/fontconfig-error-out-of-memory

所以我无法通过软件修复它,用户必须修复它......因为它取决于系统......

即使是内置版本,这些错误仍然会显示在命令行上...由于它们不会导致应用程序异常,我认为用户不应该看到它们。

如何在不显示这些错误的情况下构建/部署应用程序?

理想情况下,部署的应用程序当然不会出现错误,但我不知道如何处理这些类型的错误...

【问题讨论】:

假设错误被打印到stderrfreopen( "/dev/null", "w", stderr ); 应该可以解决问题。显然,您需要一些其他方法来在 Windows 上获取空设备。更便携的方式可能是***.com/questions/4954140/… 中的代码,但我不知道是否使用 Qt 消息基础结构打印了 fonconfig 错误。 因为它是一个 GUI 应用程序,Windows 用户不太可能看到这些错误......但我不明白在哪里放置 "freopen("/dev/null", "w", 标准错误);"命令? 我没有看到这些错误的打印位置,它们不是 qDebug 输出 对于 Windows:是的,但是当您尝试将流重定向到不存在的文件时可能会遇到更多错误。放置位置:在您的main 中,在其他任何事情发生之前。 能否请您作为答案发布,以便我接受,谢谢 【参考方案1】:

可以在使用后重定向流(在本例中为 stderr

freopen("/dev/null", "w", stderr);

只需在任何其他代码运行之前将其放在您的main 中,您应该会很好。请记住,这可能需要在 Windows 上进行更多工作。

如果错误消息是通过 Qt 消息基础结构(qDebug 等)发布的,您可以通过函数 qInstallMsgHandler 设置新的消息处理程序。

【讨论】:

@Thalia 不要忘记还有一个#if !defined(NDEBUG),这样您仍然可以在调试版本中获得输出。 哦,我在 pro 文件中添加了定义 - unix:CONFIG(release):DEFINES += NO_RELEASE_ERRORS... 虽然使用 NODEBUG 可能会更好? @Thalia NDEBUG 是一种用于指示调试模式的标准定义,也被 <assert.h> a.k.a. std::assert 认可。 试过... #if !defined(Q_OS_WIN32) && !defined(NDEBUG) 但这似乎在 DEBUG 或 RELEASE 中都是正确的,也许并非所有编译器都定义相同的符号? @Thalia 这在很大程度上取决于您的构建系统,而 cmets 不是解决问题的正确位置。

以上是关于Qt 应用程序中显示的错误 - 如何在 Release 中不显示它们的主要内容,如果未能解决你的问题,请参考以下文章

使用静态 Qt 构建在 Linux 上部署 Qt5 应用程序

Qt 中未显示 JPEG 图像

在VNC上运行Qt GUI应用程序导致分段错误,并显示错误消息

XCB 错误:148 - Qt 应用程序显示问题

当我使用静态构建时,Qt qml 显示错误

Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)