5

I have the following code:

if __name__ == '__main__':
    os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    engine.load('./QML/main.qml')

    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec_())

As you can see, if `engine.load' fails all I'll see is a '-1' exit code, without any elaboration on why it failed and what the error happened. How can I print the QML error in the python console?

There was a walkaround for this with when using QQuickView instead of QQmlApplicationEngine and is described in this post, however, I wonder if the something similar can be achieved for QQmlApplicationEngine?

3
  • relative stackoverflow.com/questions/45805076/… Commented Dec 31, 2018 at 22:29
  • @eyllanesc I tried to set QQmlEngine::setOutputWarningsToStandardError(bool enabled) to true, and to connect to the warnings signal ... No luck so far... Commented Dec 31, 2018 at 22:41
  • Exactly, you have reviewed stackoverflow.com/questions/45805076/…: this is probably a bug, I recommend you report it. Commented Dec 31, 2018 at 22:43

1 Answer 1

5

If you want to know the error message when using QQmlApplicationEngine you should use the warnings signal but it does not seem to work, so a workaround is to use qInstallMessageHandler to get the messages that Qt gives.

import os
import sys
from PySide2 import QtCore, QtGui, QtQml

def qt_message_handler(mode, context, message):
    if mode == QtCore.QtInfoMsg:
        mode = 'Info'
    elif mode == QtCore.QtWarningMsg:
        mode = 'Warning'
    elif mode == QtCore.QtCriticalMsg:
        mode = 'critical'
    elif mode == QtCore.QtFatalMsg:
        mode = 'fatal'
    else:
        mode = 'Debug'
    print("%s: %s (%s:%d, %s)" % (mode, message, context.file, context.line, context.file))


if __name__ == '__main__':
    os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
    QtCore.qInstallMessageHandler(qt_message_handler)
    app = QtGui.QGuiApplication(sys.argv)
    engine = QtQml.QQmlApplicationEngine()
    qml_filename = os.path.join(os.path.dirname(__file__), 'QML/main.qml')
    engine.load(QtCore.QUrl.fromLocalFile(qml_filename))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())
Sign up to request clarification or add additional context in comments.

10 Comments

This seems to work when there is an error in the QML files themselves,(For example when I input a string value in a height: parameter) however, it doesn't work when there is a problem in the imports. I made a delegate in another file(In the same directory as 'main.qml') and I'm trying to import it into 'main.qml' this is where my engine.load is failing. Yet it seems that qInstallMessageHandler isn't helpful for this scenario.
@Curtwagner1984 You could share your test through gist or github.
@Curtwagner1984 Do not you have another simpler example? I do not want to have to get the credentials of reddit to be able to test the problem :-)
@eyllansec I've changed the main, added a moc sub, also created a new 'qml' file. Right now it exits with code -1 without telling what the error is. I've updated the gist Does it work for you when you try to import a file that doesn't exist? (IE does it complain that a file doesn't exist, or just exits with -1?)
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.