Print QStandardItemModel



  • I want to print rows of "QStandardItemModel". I use this code, It works but table is not beautiful. I don't know how to adjust row height and I don't know how to set column widths based on the width of cells in the first row of the table.

    demo

    QPrinter printer;
        printer.setPageSize(QPrinter::A4);
        printer.setFullPage(true);
    
        QPrintDialog *dlg = new QPrintDialog(&printer,0);
        if(dlg->exec() == QDialog::Accepted) {
    
            QPainter painter;
            if (painter.begin(&printer)) {
    			
                painter.translate(0,0);
    			
    			int position = 0;
                int rowCount=newMyModel->rowCount(QModelIndex());
    
                for(int r=0;r<rowCount;r++)
    			{
                    if( position > painter.window().height()-100 ) 
    				{
                        printer.newPage();
    
                        position = 0;
                        painter.resetTransform();
                        painter.translate(0, 0);
                    }
    
                    QString html="<table style='page-break-after:always' border='1' width='100%' cellpadding =10  style='border-width: 1px;border-style: solid;border-color: #9e9e9e;width:100%'>";
    
                        index=newMyModel->index(r, 0);
    
                        QVariant prop1=index.data(MyModel::prop1);
                        QVariant prop2=index.data(MyModel::prop2);
    
    					'''
    					'''
    					'''
    					
                        html.append(
                        "<tr style='background-color:red'>"
                        "<td style='border-width: 1px;padding:10; border-style: solid; border-color: #9e9e9e;width:16%'>"+prop1.toString()+" </td>"
                        "<td style='border-width: 1px;padding:10; border-style: solid; border-color: #9e9e9e;width:16%'>"+prop2.toString()+" </td>"
                        ...
    					...
    					...);
    
                    }
    
                    html.append("</table>");
    
                    QRect rect = painter.boundingRect(painter.window(),
                                                      Qt::AlignJustify | Qt::TextWordWrap,
                                                      html);
                    QTextDocument doc;                
                    doc.setHtml(html);
                    doc.drawContents(&painter, rect);
    
                    painter.drawRect(rect);
                    painter.translate(0, rect.height());
                    position += rect.height();
                }
                painter.end();
            }
        }
    


  • Any reason why you cannot use a QTableView or build your own view?



  • @VRonin

    I use this code but it does not work (Print blank page).

    QPrinter printer;
        printer.setPageSize(QPrinter::A4);
        printer.setFullPage(true);
    
        QPrintDialog *dlg = new QPrintDialog(&printer,0);
        if(dlg->exec() == QDialog::Accepted) {
    
            QTableView* pTableView = new QTableView;
            pTableView->setModel(newMyModel);
    
            int width = 0;
            int height = 0;
            int columns = newMyModel->columnCount();
            int rows = newMyModel->rowCount();
    
            pTableView->resizeColumnsToContents();
    
            for( int i = 0; i < columns; ++i ) {
                width += pTableView->columnWidth(i);
            }
    
            for( int i = 0; i < rows; ++i ) {
                height += pTableView->rowHeight(i);
            }
    
            pTableView->setFixedSize(width, height);
            pTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
            pTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    
             pTableView->render(&printer);
    

Log in to reply
 

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