⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printout.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Linguist of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "printout.h"#include <QPrinter>#include <QFontMetrics>PrintOut::PrintOut( QPrinter *printer )    : pr( printer ), nextRule( NoRule ), page( 0 ){    p.begin( pr );    QFont f( "Arial" );    f8 = f;    f8.setPointSize( 8 );    f10 = f;    f10.setPointSize( 10 );    p.setFont( f10 );    fmetrics = new QFontMetrics( p.fontMetrics() );    hmargin = 5 * printer->width() / printer->widthMM(); // 5 mm    vmargin = 5 * printer->height() / printer->heightMM(); // 5 mm    hsize = printer->width() - 2 * hmargin;    vsize = printer->height() - vmargin;    dateTime = QDateTime::currentDateTime();    breakPage(true); // init vsize and draw first header    cp = Paragraph( QPoint(hmargin, voffset) );}PrintOut::~PrintOut(){    flushLine();    delete fmetrics;    p.end();}void PrintOut::setRule( Rule rule ){    if ( (int) nextRule < (int) rule )        nextRule = rule;}void PrintOut::setGuide( const QString& guide ){    g = guide;}void PrintOut::vskip(){    if ( !firstParagraph )        voffset += 14;}void PrintOut::flushLine( bool /* mayBreak */ ){    if ( voffset + cp.rect.height() > vsize )        breakPage();    else if ( !firstParagraph )        drawRule( nextRule );    for ( int i = 0; i < (int) cp.boxes.count(); i++ ) {        Box b = cp.boxes[i];        b.rect.translate( 0, voffset );        QRect r = b.rect;        p.setFont( b.font );        p.drawText( r, b.align, b.text );    }    voffset += cp.rect.height();    nextRule = NoRule;    cp = Paragraph( QPoint(hmargin, voffset) );    firstParagraph = false;}void PrintOut::addBox( int percent, const QString& text, Style style,                       int halign ){    int align = halign | Qt::AlignTop;    QFont f = f10;    if ( style == Strong )        f.setBold( true );    else if ( style == Emphasis )        f.setItalic( true );    int wd = hsize * percent / 100;    QRect r( cp.rect.x() + cp.rect.width(), 0, wd, vsize );    int ht = p.boundingRect( r, align, text ).height();    Box b( r, text, f, align );    cp.boxes.append( b );    cp.rect.setSize( QSize(cp.rect.width() + wd, qMax(cp.rect.height(), ht)) );}// use init if inital vsize should be calculated (first breakPage call)void PrintOut::breakPage(bool init){    static const int LeftAlign = Qt::AlignLeft | Qt::AlignTop;    static const int RightAlign = Qt::AlignRight | Qt::AlignTop;    QRect r1, r2;    int h1 = 0;    int h2 = 0;    if (page > 0)        pr->newPage();    if (!init)        page++;    voffset = 0;    p.setFont( f10 );    r1 = QRect( hmargin, voffset, 3 * hsize / 4, vsize );    r2 = QRect( r1.x() + r1.width(), voffset, hsize - r1.width(), vsize );    h1 = p.boundingRect( r1, LeftAlign, pr->docName() ).height();    if (!init)        p.drawText( r1, LeftAlign, pr->docName() );    h2 = p.boundingRect( r2, RightAlign, QString::number(page) ).height();    if (!init)        p.drawText( r2, RightAlign, QString::number(page) );    voffset += qMax( h1, h2 );    r1 = QRect( hmargin, voffset, hsize / 2, LeftAlign );    p.setFont( f8 );    h1 = p.boundingRect( r1, LeftAlign, dateTime.toString() ).height();    if (!init)        p.drawText ( r1, LeftAlign, dateTime.toString() );    p.setFont( f10 );    voffset += qMax( h1, h2 );    voffset += 4;    if (!init)        p.drawLine( QPoint(hmargin, voffset), QPoint(hmargin + hsize, voffset) );    voffset += 14;    firstParagraph = true;    if (init)    {        vsize -= voffset;        breakPage(); // now draw it when the vsize is ok    }}void PrintOut::drawRule( Rule rule ){    QPen pen;    switch ( rule ) {    case NoRule:        voffset += 5;        break;    case ThinRule:        pen.setColor( QColor(192, 192, 192) );        pen.setStyle( Qt::DotLine );        pen.setWidth( 0 );        p.setPen( pen );        voffset += 5;        p.drawLine( QPoint(hmargin, voffset),                    QPoint(hmargin + hsize, voffset) );        p.setPen( QPen() );        voffset += 2;        break;    case ThickRule:        voffset += 7;        p.drawLine( QPoint(hmargin, voffset),                    QPoint(hmargin + hsize, voffset) );        voffset += 4;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -