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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.