【问题标题】:QML console.log() and console.debug() don't write to consoleQML console.log() 和 console.debug() 不写入控制台
【发布时间】:2016-07-20 04:16:48
【问题描述】:

我在 Fedora 23 上使用 Qt 5.6,我注意到 console.log()console.debug() 不会向控制台写入任何内容。我的示例代码:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent

        Component.onCompleted: {
            console.warn("warn completed")
            console.log("log completed")
            console.error("error completed")
            console.debug("debug completed")
            console.exception("exception completed")
            console.info("info completed")
        }
    }
}

打印到控制台:

QML debugging is enabled. Only use this in a safe environment.
qml: warn completed
qml: error completed
qml: exception completed
onCompleted (qrc:/main.qml:16)
qml: info completed

所以warnerrorexceptioninfo 工作正常。我做错了什么?

编辑#1: 项目是新创建的,我的所有来源:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

项目.pro

TEMPLATE = app

QT += qml quick
CONFIG += c++11

SOURCES += main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

编辑#2: Qt Creator 的编译输出显示没有QT_NO_DEBUG_OUTPUTQT_NO_INFO_OUTPUTQT_NO_WARNING_OUTPUT

14:43:36: Running steps for project project...
14:43:36: Configuration unchanged, skipping qmake step.
14:43:36: Starting: "/usr/bin/make" 
g++ -c -pipe -g -std=gnu++0x -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../project -I. -I../../Qt5.6.0/5.6/gcc_64/include -I../../Qt5.6.0/5.6/gcc_64/include/QtQuick -I../../Qt5.6.0/5.6/gcc_64/include/QtGui -I../../Qt5.6.0/5.6/gcc_64/include/QtQml -I../../Qt5.6.0/5.6/gcc_64/include/QtNetwork -I../../Qt5.6.0/5.6/gcc_64/include/QtCore -I. -I../../Qt5.6.0/5.6/gcc_64/mkspecs/linux-g++ -o main.o ../project/main.cpp
/home/krzys/Qt5.6.0/5.6/gcc_64/bin/rcc -name qml ../project/qml.qrc -o qrc_qml.cpp
g++ -c -pipe -g -std=gnu++0x -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../project -I. -I../../Qt5.6.0/5.6/gcc_64/include -I../../Qt5.6.0/5.6/gcc_64/include/QtQuick -I../../Qt5.6.0/5.6/gcc_64/include/QtGui -I../../Qt5.6.0/5.6/gcc_64/include/QtQml -I../../Qt5.6.0/5.6/gcc_64/include/QtNetwork -I../../Qt5.6.0/5.6/gcc_64/include/QtCore -I. -I../../Qt5.6.0/5.6/gcc_64/mkspecs/linux-g++ -o qrc_qml.o qrc_qml.cpp
g++ -Wl,-z,origin -Wl,-rpath,\$ORIGIN -Wl,-rpath,/home/krzys/Qt5.6.0/5.6/gcc_64/lib -o project main.o qrc_qml.o   -L/home/krzys/Qt5.6.0/5.6/gcc_64/lib -lQt5Quick -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -lGL -lpthread 
14:43:37: The process "/usr/bin/make" exited normally.
14:43:37: Elapsed time: 00:01.

【问题讨论】:

  • 你是在发布模式还是调试模式下构建的? info/debug 被翻译成 qDebug,我认为,在发布模式下可以禁用。
  • 根据文档,qDebug()qInfo()qWarning()是调试工具。它们可以通过在编译期间定义QT_NO_DEBUG_OUTPUTQT_NO_INFO_OUTPUTQT_NO_WARNING_OUTPUT 来编译掉。
  • @FrankOsterfeld:我的 Qt Creator (3.6.1) 提供了三个版本:Debug、Profile、Release,我尝试了所有三个版本,结果相同。 @Tarod:我使用了新创建的项目,我没有向源或project.pro 文件添加任何自定义定义。对问题进行了编辑以包含所有来源。
  • 看起来您使用的是预构建的 Qt,它始终是发布版本。 Creator 中的 Debug 和 Release 构建模式只会改变 您的项目 的构建方式,而不是 Qt 本身。不过,我认为这些都不重要,因为我确实使用预构建的 Qt 获得了日志/调试输出。我建议自己构建 Qt 并进入源代码以查看发生了什么。

标签: qt qml fedora


【解决方案1】:

Fedora 22 及更高版本默认禁用 Qt 调试输出 [1]。您可以通过修改系统范围的/etc/xdg/QtProject/qtlogging.ini 或通过创建用户特定的配置文件~/.config/QtProject/qtlogging.ini 来启用Qt 调试输出,例如具有以下内容:

[Rules]
*.debug=true
  1. https://bugzilla.redhat.com/show_bug.cgi?id=1227295

【讨论】:

  • 感谢您指出错误报告、描述和它下面的 cmets 解释了整个问题。规则 *.debug=true 单独启用了大量 QT 库日志,但添加 qt.*.debug=false 修复了它。 tldr;以下配置保存在~/.config/QtProject/qtlogging.ini 中修复了调试问题。 [Rules] *.debug=true; qt.*.debug=false
【解决方案2】:

我通过添加两者之一找到了更方便的解决方案 - 取决于 如果您对 pro 文件使用 Qt Quick 1 或 2(重新构建并再次运行 QMake),则开启 根据https://doc.qt.io/qt-5/qtquick-debugging.html

Qt Quick 1: CONFIG+=declarative_debug
Qt Quick 2: CONFIG+=qml_debug

要将其放入您的代码中,如下所示:

项目.pro


TEMPLATE = app

QT += qml quick
CONFIG += c++11 qml_debug #or CONFIG+=declarative_debug for QtQuick 1

SOURCES += main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

现在它可能看起来像这样:

【讨论】:

    【解决方案3】:

    而不是像 jpnurmiaccepted answer 中建议的那样在系统范围内启用调试日志记录。您可以简单地设置一个系统变量来让调试消息显示在控制台中。 Qt Wiki about Logging Rules

    为您的应用程序或 qmlscene/qhot qml-preview 的一次执行设置它。如果您从命令行启动它们:

    $ QT_LOGGING_RULES="*.debug=true; qt.*.debug=false" your_executable
    $ QT_LOGGING_RULES="*.debug=true; qt.*.debug=false" qmlscene/qhot main.qml
    

    或者只为这个会话设置它(重启后将取消设置)。即使您从 QtCreator 或其他 IDE 启动/测试,也应该受到尊重:

    $ export QT_LOGGING_RULES="*.debug=true; qt.*.debug=false"
    

    然后正常启动/测试您的可执行文件或 qmlscene/qhot

    为什么这样更好?

    在系统范围内设置日志记录规则意味着您运行的所有Qt 应用程序都会将调试消息写入它们的日志文件。我发现了一些 千兆字节 大小的日志文件,因为这些应用在正常使用期间会在其日志中累积大量调试消息。

    【讨论】:

      猜你喜欢
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      相关资源
      最近更新 更多