Ignore:
Timestamp:
May 10, 2017, 3:20:54 PM (7 years ago)
Author:
stoecker
Message:

update qwt and qwtpolar, many QT5 fixes (unfinished)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/qwtpolar/qwt_polar_renderer.cpp

    r4272 r8127  
    1111#include "qwt_polar_layout.h"
    1212#include <qwt_legend.h>
    13 #include <qwt_legend_item.h>
    1413#include <qwt_dyngrid_layout.h>
    1514#include <qwt_text_label.h>
     
    1716#include <qpainter.h>
    1817#include <qprinter.h>
     18#include <qprintdialog.h>
     19#include <qfiledialog.h>
    1920#include <qimagewriter.h>
    2021#include <qfileinfo.h>
     
    115116
    116117    const QString fmt = format.toLower();
    117     if ( format == "pdf" || format == "ps" )
    118     {
     118    if ( format == "pdf" )
     119    {
     120#ifndef QT_NO_PRINTER
    119121        QPrinter printer;
     122        printer.setColorMode( QPrinter::Color );
    120123        printer.setFullPage( true );
    121124        printer.setPaperSize( sizeMM, QPrinter::Millimeter );
    122125        printer.setDocName( title );
    123126        printer.setOutputFileName( fileName );
    124         printer.setOutputFormat( ( format == "pdf" )
    125             ? QPrinter::PdfFormat : QPrinter::PostScriptFormat );
     127        printer.setOutputFormat( QPrinter::PdfFormat );
    126128        printer.setResolution( resolution );
    127129
    128130        QPainter painter( &printer );
    129131        render( plot, &painter, documentRect );
     132#endif
     133    }
     134    else if ( format == "ps" )
     135    {
     136#if QT_VERSION < 0x050000
     137#ifndef QT_NO_PRINTER
     138        QPrinter printer;
     139        printer.setColorMode( QPrinter::Color );
     140        printer.setFullPage( true );
     141        printer.setPaperSize( sizeMM, QPrinter::Millimeter );
     142        printer.setDocName( title );
     143        printer.setOutputFileName( fileName );
     144        printer.setOutputFormat( QPrinter::PostScriptFormat );
     145        printer.setResolution( resolution );
     146
     147        QPainter painter( &printer );
     148        render( plot, &painter, documentRect );
     149#endif
     150#endif
    130151    }
    131152#ifndef QWT_NO_POLAR_SVG
     
    300321
    301322    painter->save();
    302     renderLegend( painter, layout->legendRect() );
     323    renderLegend( plot, painter, layout->legendRect() );
    303324    painter->restore();
    304325
     
    340361  Render the legend into a given rectangle.
    341362
     363  \param plot Plot widget
    342364  \param painter Painter
    343365  \param rect Bounding rectangle
    344366*/
    345 
    346 void QwtPolarRenderer::renderLegend(
     367void QwtPolarRenderer::renderLegend( const QwtPolarPlot *plot,
    347368    QPainter *painter, const QRectF &rect ) const
    348369{
    349     QwtLegend *legend = d_data->plot->legend();
    350     if ( legend == NULL || legend->isEmpty() )
    351         return;
    352 
    353     const QwtDynGridLayout *legendLayout = qobject_cast<QwtDynGridLayout *>(
    354         legend->contentsWidget()->layout() );
    355     if ( legendLayout == NULL )
    356         return;
    357 
    358     uint numCols = legendLayout->columnsForWidth( rect.width() );
    359     const QList<QRect> itemRects =
    360         legendLayout->layoutItems( rect.toRect(), numCols );
    361 
    362     int index = 0;
    363 
    364     for ( int i = 0; i < legendLayout->count(); i++ )
    365     {
    366         QLayoutItem *item = legendLayout->itemAt( i );
    367         QWidget *w = item->widget();
    368         if ( w )
     370    if ( plot->legend() )
     371        plot->legend()->renderLegend( painter, rect, true );
     372}
     373
     374/*!
     375   \brief Execute a file dialog and render the plot to the selected file
     376
     377   The document will be rendered in 85 dpi for a size 30x30 cm
     378
     379   \param plot Plot widget
     380   \param documentName Default document name
     381   \param sizeMM Size for the document in millimeters.
     382   \param resolution Resolution in dots per Inch (dpi)
     383
     384   \sa renderDocument()
     385*/
     386bool QwtPolarRenderer::exportTo( QwtPolarPlot *plot,
     387    const QString &documentName, const QSizeF &sizeMM, int resolution )
     388{
     389    if ( plot == NULL )
     390        return false;
     391
     392    QString fileName = documentName;
     393
     394    // What about translation
     395
     396#ifndef QT_NO_FILEDIALOG
     397    const QList<QByteArray> imageFormats =
     398        QImageWriter::supportedImageFormats();
     399
     400    QStringList filter;
     401#ifndef QT_NO_PRINTER
     402    filter += QString( "PDF " ) + tr( "Documents" ) + " (*.pdf)";
     403#endif
     404#ifndef QWT_NO_SVG
     405    filter += QString( "SVG " ) + tr( "Documents" ) + " (*.svg)";
     406#endif
     407#ifndef QT_NO_PRINTER
     408    filter += QString( "Postscript " ) + tr( "Documents" ) + " (*.ps)";
     409#endif
     410
     411    if ( imageFormats.size() > 0 )
     412    {
     413        QString imageFilter( tr( "Images" ) );
     414        imageFilter += " (";
     415        for ( int i = 0; i < imageFormats.size(); i++ )
    369416        {
    370             painter->save();
    371 
    372             painter->setClipRect( itemRects[index] );
    373             renderLegendItem( painter, w, itemRects[index] );
    374 
    375             index++;
    376             painter->restore();
     417            if ( i > 0 )
     418                imageFilter += " ";
     419            imageFilter += "*.";
     420            imageFilter += imageFormats[i];
    377421        }
    378     }
    379 
    380 }
    381 
    382 /*!
    383   Print the legend item into a given rectangle.
    384 
    385   \param painter Painter
    386   \param widget Widget representing a legend item
    387   \param rect Bounding rectangle
    388 
    389   \note When widget is not derived from QwtLegendItem renderLegendItem
    390         does nothing and needs to be overloaded
    391 */
    392 void QwtPolarRenderer::renderLegendItem( QPainter *painter,
    393     const QWidget *widget, const QRectF &rect ) const
    394 {
    395     const QwtLegendItem *item = qobject_cast<const QwtLegendItem *>( widget );
    396     if ( item )
    397     {
    398         const QSize sz = item->identifierSize();
    399 
    400         const QRectF identifierRect( rect.x() + item->margin(),
    401             rect.center().y() - 0.5 * sz.height(), sz.width(), sz.height() );
    402 
    403         QwtLegendItemManager *itemManger = d_data->plot->legend()->find( item );
    404         if ( itemManger )
    405         {
    406             painter->save();
    407             painter->setClipRect( identifierRect, Qt::IntersectClip );
    408             itemManger->drawLegendIdentifier( painter, identifierRect );
    409             painter->restore();
    410         }
    411 
    412         // Label
    413 
    414         QRectF titleRect = rect;
    415         titleRect.setX( identifierRect.right() + 2 * item->spacing() );
    416 
    417         painter->setFont( item->font() );
    418         item->text().draw( painter, titleRect );
    419     }
    420 }
    421 
     422        imageFilter += ")";
     423
     424        filter += imageFilter;
     425    }
     426
     427    fileName = QFileDialog::getSaveFileName(
     428        NULL, tr( "Export File Name" ), fileName,
     429        filter.join( ";;" ), NULL, QFileDialog::DontConfirmOverwrite );
     430#endif
     431    if ( fileName.isEmpty() )
     432        return false;
     433
     434    renderDocument( plot, fileName, sizeMM, resolution );
     435
     436    return true;
     437}
Note: See TracChangeset for help on using the changeset viewer.