Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Print multiple tabs to single pdf
Forum Updated to NodeBB v4.3 + New Features

Print multiple tabs to single pdf

Scheduled Pinned Locked Moved QML and Qt Quick
2 Posts 1 Posters 1.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Q Offline
    Q Offline
    qmlLearner
    wrote on last edited by
    #1

    Dear qt quick community!

    I am still learning qml and I am currently developing a tool for myself. Following you find a screenshot of what the tool roughly looks like at the moment:

    !http://oi60.tinypic.com/o05gko.jpg(screenshot tool)!

    So basically, I have an application window with some tool buttons and multiple tabs. What I what to do now, is to implement the 'saveAsPdf'-button, which gathers all the information on the different tabs and creates a pdf.
    My problem is that I am not able to access the data (e.g. comboboxes, textfields, listview etc.) from the ToolButton in the ApplicationWindow. Following you find my code so far:

    main.qml:
    @
    import QtQuick 2.2
    import QtQuick.Controls 1.1
    import QtQuick.Controls.Styles 1.1
    import QtQuick.Layouts 1.1

    import "MyConst.js" as Const

    ApplicationWindow {

    id: id_applicationWindow
    
    width: 800
    height: 800
    
    property int margin: 11
    
    Component{
        id: id_comp
        MyTab{
            id: id_myTab
        }
    }
    
    menuBar: MenuBar {
        Menu {
            title: "File"
            MenuItem { text: "Open..." }
            MenuItem { text: "Close" }
        }
        Menu {
            title: "Edit"
            MenuItem { text: "Cut" }
            MenuItem { text: "Copy" }
            MenuItem { text: "Paste" }
        }
    }
    
    toolBar: ToolBar {
    
        width: id_applicationWindow.width
        height: 50
    
        ToolButton {
            id: id_addTab
            text: "add tab"
            anchors.verticalCenter: parent.verticalCenter
            onClicked: {
                id_tabView.myAddTab("tab", id_comp)
            }
        }
    
        ToolButton {
            id: id_removeTab
            text: "remove tab"
            anchors.left: id_addTab.right
            anchors.leftMargin: Const.mySpacing
            anchors.verticalCenter: parent.verticalCenter
            onClicked: {
                id_tabView.myRemoveCurrentTab();
            }
        }
    
        ToolButton {
            id: id_save
            text: "saveAsPdf"
            anchors.left: id_removeTab.right
            anchors.leftMargin: Const.mySpacing
            anchors.verticalCenter: parent.verticalCenter
            onClicked: {
                console.log("number of open tabs: " + id_tabView.count)
                console.log("current tab: " + id_tabView.currentIndex)
                var nbTabs = id_tabView.count
                for (var i=0; i<nbTabs; i++) {
                    console.log("airport tab " + i + ": " + id_tabView.getTab(i).children)
                    console.log("nb children: " + id_tabView.getTab(i).children.length)
                    var myChildrenList = id_tabView.getTab(i).children
                }
            }
        }
    }
    
    TabView{
        id: id_tabView
        anchors.fill: parent
    
        Tab{
            id: id_tab0
            title: "myTab"
            MyTab{
                id: id_myTab
            }
        }
    
        function myAddTab(title, componentID){
            if (id_tabView.count < 10)
                id_tabView.addTab(title, componentID)
        }
    
        function myRemoveCurrentTab(){
            if (id_tabView.count > 1)
                id_tabView.removeTab(id_tabView.currentIndex)
        }
    
    }
    

    }
    @

    a snippet of MyTab.qml:
    @

    import QtQuick 2.2
    import QtQuick.Controls 1.1
    import QtQuick.Layouts 1.1

    import QtQuick.XmlListModel 2.0
    import QtQuick.Controls.Styles 1.1

    import "MyFunctions.js" as FormatFunctions

    import DownloadManager 1.0
    import XMLCrawler 1.0

    Item{
    id: id_itemTab
    anchors.fill: parent
    anchors.margins: 8

    ColumnLayout {
    

    ...
    }
    @

    What is the best way to access all the data on the different tabs? Do you have any suggestions? I am very thankful for any hint or suggestion...also concerning my code in general! Thank you very much!

    PS: when I hit the button 'remove tab', I get the following typeError:
    "MyTab.qml:15: TypeError: Cannot read property of null"
    where line 15 is: "anchors.fill: parent" in MyTab.qml
    I wasn't able to figure out why I get this error...any hints?

    1 Reply Last reply
    0
    • Q Offline
      Q Offline
      qmlLearner
      wrote on last edited by
      #2

      Alright, so I figured out how to access the data of a custom component: 'property alias' did the magic :)
      Now for the second part (creating a pdf), I am almost done, but I have a weird issue: My goal is to have several tables with only a single pixel border...unfortunately 'border-collapse' is not supported by QT's html subset. Kind of a workaround is to set the cell spacing to -1. However, then there is a weird issue with the colors/borders, as can be seen in the following pictures:
      !http://oi61.tinypic.com/96dun7.jpg(table border)!
      !http://oi57.tinypic.com/t7h34x.jpg!
      The code to produced the above pdf is:
      @
      QTextDocument doc2;
      QTextCursor myCursor(&doc2);
      myCursor.insertText("This is the first page");

      QTextTableFormat myTableFormat;
      myTableFormat.setBorder( QTextFrameFormat::BorderStyle_Solid );
      myTableFormat.setBorder(1);
      myTableFormat.setBorderBrush(QBrush(QColor(200, 200, 200)));
      myTableFormat.setCellPadding(0);
      myTableFormat.setCellSpacing(-1);
      myTableFormat.setWidth( QTextLength(QTextLength::PercentageLength, 100) );
      myTableFormat.setAlignment( Qt::AlignLeft );
      myCursor.insertTable(4, 2, myTableFormat);
      
      printer.setOutputFileName(currPath + "/test02.pdf");
      printer.setOutputFormat( QPrinter::PdfFormat );
      printer.setPaperSize(QPrinter::A4);
      printer.setPageMargins( 20, 20, 20, 20, QPrinter::Millimeter);
      doc2.print(&printer);
      printer.newPage();
      

      @
      I tested different colors and my impression is that the table always consists of two colors...Is there a way to assign these colors?

      I know I could use the webkit as well for printing (https://qt-project.org/forums/viewthread/22137). However, the dll is about 30Mb and I would like to avoid it if possible.

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved