Problems with Open-Source Downloads read https://www.qt.io/blog/problem-with-open-source-downloads and https://forum.qt.io/post/638946

Issue printing in QtQuick app



  • Hello,

    I am trying to print in a QtQuick app.
    in my main.cpp, I have changed the QGuiApplication into a QApplication and I have added printsupport in my .pro file.

    I have a button in qml that calls:

    void CBSModel::print()
    {
        qDebug() << 1;
        QPrinter printer(QPrinter::HighResolution);
        QPrintDialog dialog(&printer, nullptr);
        dialog.setWindowTitle(tr("Print couder mask"));
        if (dialog.exec() != QDialog::Accepted) return;
    }
    

    But calling this function causes a crash once the function returns...
    Is there anything that I am missing that is causing such a crash?
    I have no problem calling other pieces of code from QML.
    removing the call to dialog.exec() makes the crash go away.

    Cyrille


  • Lifetime Qt Champion

    Hi,

    What version of Qt are you using ?
    On what OS ?
    Can you post the stack trace ?



  • Hello,

    QT 5.11.2
    I get a "SIGSEV"

    Here is the raw data...

    onecoreuap\shell\windows.storage\viewsettings.cpp(3603)\windows.storage.dll!76081EBE: (caller: 76081F4F) ReturnHr(1) tid(180) 80004005 Unspecified error

    1 QQuickPointerMouseEvent::isDoubleClickEvent qquickevents.cpp 1514 0x217ecd8b
    2 QQuickWindowPrivate::deliverMatchingPointsToItem qquickwindow.cpp 2540 0x2181ff02
    3 QQuickWindowPrivate::deliverPressOrReleaseEvent qquickwindow.cpp 2524 0x2182121b
    4 QQuickWindowPrivate::deliverMouseEvent qquickwindow.cpp 1761 0x21821556
    5 QQuickWindowPrivate::deliverPointerEvent qquickwindow.cpp 2317 0x21821f9f
    6 QQuickWindowPrivate::handleMouseEvent qquickwindow.cpp 2152 0x21822bba
    7 QQuickWindow::mousePressEvent qquickwindow.cpp 2119 0x21822fe4
    8 QWindow::event qwindow.cpp 2242 0xcb54880
    9 QQuickWindow::event qquickwindow.cpp 1634 0x218247ab
    10 QApplicationPrivate::notify_helper qapplication.cpp 3727 0x2c5e85ca
    11 QApplication::notify qapplication.cpp 3099 0x2c5efb83
    12 QCoreApplication::notifyInternal2 qcoreapplication.cpp 1048 0x1a514e01
    13 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 237 0xcb4acae
    14 QGuiApplicationPrivate::processMouseEvent qguiapplication.cpp 2081 0xcb4acae
    15 QGuiApplicationPrivate::processWindowSystemEvent qguiapplication.cpp 1816 0xcb4c589
    16 QWindowSystemInterface::sendWindowSystemEvents qwindowsysteminterface.cpp 1032 0xcb2df99
    17 QWindowsGuiEventDispatcher::sendPostedEvents qwindowsguieventdispatcher.cpp 82 0x3e2adcb4
    18 qt_internal_proc(HWND__ *, unsigned int, unsigned int, long) *16 qeventdispatcher_win.cpp 237 0x1a5650d1
    19 USER32!AddClipboardFormatListener 0x7546be6b
    20 USER32!DispatchMessageW 0x7546833a
    21 USER32!DispatchMessageW 0x75467bee
    22 USER32!DispatchMessageW 0x754679d0
    23 QEventDispatcherWin32::processEvents qeventdispatcher_win.cpp 629 0x1a56482c
    24 QWindowsGuiEventDispatcher::processEvents qwindowsguieventdispatcher.cpp 74 0x3e2adc87
    25 QEventLoop::processEvents qeventloop.cpp 136 0x1a5134b0
    26 QEventLoop::exec qeventloop.cpp 214 0x1a513908
    27 QCoreApplication::exec qcoreapplication.cpp 1336 0x1a51bff6
    28 QGuiApplication::exec qguiapplication.cpp 1761 0xcb415c6
    29 QApplication::exec qapplication.cpp 2901 0x2c5e84a9
    30 qMain main.cpp 40 0x4018d4
    31 WinMain *16 qtmain_win.cpp 104 0x40ce65
    32 main 0x431a3d


  • Lifetime Qt Champion

    Can you provide a minimal compilable example that triggers this ?



  • Hello,

    After a lot of work, I found the following:

    if you use the first version of the "print" code, things work
    if you use the 2nd version (with the listView), it crashes!!!!
    To reproduce the bug, compile/start the app. Press on the "print" button, click on cancel on the print dialog box, wait 1~2 seconds... it crashes...

    main.qml // This version works...

    import QtQuick 2.9
    import QtQuick.Controls 2.4
    import "qrc:/qml/" //import the qml folder
    import CBSModel 1.0
    
    ApplicationWindow { visible: true; width: 600; height: 600;
    //        SwipeView { anchors.fill: parent;
                    Button   { text: qsTr("Print"); onPressed: CBSModel.printCouder() }
    //        }
    }
    

    main.qml // This version crashes!

    import QtQuick 2.9
    import QtQuick.Controls 2.4
    import "qrc:/qml/" //import the qml folder
    import CBSModel 1.0
    
    ApplicationWindow { visible: true; width: 600; height: 600;
            SwipeView { anchors.fill: parent;
                    Button   { text: qsTr("Print"); onPressed: CBSModel.printCouder() }
            }
    }
    

    main.cpp

    #include <QApplication>
    #include <QQmlApplicationEngine>
    #include <QQuickStyle>
    #include <QIcon>
    #include "model.h"
    
    CBSModel *CBSModel::singleton= nullptr;
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QIcon iconApplication;
    #ifdef WINDOWS
        iconApplication = readIcoFile("qrc:/Resources/cbscope.ico");
    #else
        iconApplication.addFile("qrc:/Resources/cbscope.icns");
    #endif
        qmlRegisterSingletonType<CBSModel>("CBSModel", 1, 0, "CBSModel", CBSModel::SingletonProvider);
        QApplication app(argc, argv);
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
            int ret= app.exec();
        return ret;
    }
    

    model.h

    #ifndef CBSMODEL_H
    #define CBSMODEL_H
    #include <QObject>
    #include <QQmlEngine>
    #include <QPrinter>
    #include <QPainter>
    #include <QPrintDialog>
    
    class CBSModel : public QObject {
        Q_OBJECT
    public:
        CBSModel(QObject *parent=nullptr): QObject(parent) { }
          static CBSModel *singleton;
        static QObject *SingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
        {   (void)engine; (void)scriptEngine;
            if (singleton==nullptr) singleton= new CBSModel();    return singleton;
        }
        Q_INVOKABLE void printCouder()
        {
            QPrinter printer(QPrinter::HighResolution);
            QPrintDialog dialog(&printer, nullptr);
            dialog.setWindowTitle(tr("Print couder mask"));
            if (dialog.exec() != QDialog::Accepted) return;
            printer.setOutputFileName("couder.ps");
            QRect area(printer.pageRect());
            int dpi= printer.resolution();
            QPoint c= area.center();
            QPainter painter;
            painter.begin(&printer);
            painter.end();
        }
    };
    
    #endif
    

    Cyrille



  • This post is deleted!


  • hello

    Is there any way to turn on in QtCreator buffer overruns detection similar to the ones build in Visual Studio?

    Cyrille


  • Lifetime Qt Champion

    I am not aware of such a feature (it doesn't mean that it doesn't exists though), but you can also use VS to build your application and use the tools you need.


Log in to reply