Drucker

Die einfachste Methode eine Text-Datei drucken zu können, ist ein QTextDocument-Objekt zu erstellen und dessen print()-Methode aufzurufen. Diese Methode benötigt ein Printer-Objekt als Parameter, das wir entweder selbst konfigurieren oder mit einem Dialog verknüpfen können. Über das Printer-Objekt können wir auch in eine PDF- oder PostScript-Datei „drucken“.

Druck-Dialog

Beispiel: Html2Pdf

Das folgende Beispiel konvertiert alle im Quellverzeichnis befindlichen HTML-Dateien (*.html, *.htm) in PDF-Dateien und speichert sie im Zielverzeichnis.

// main.cpp
#include "ConversionWidget.h"
#include <QApplication>
 
int main( int argc, char *argv[] )
{
  QApplication app( argc, argv );
  ConversionWidget widget;
  widget.show();
  return app.exec();
}
// ConversionWidget.h
#ifndef CONVERSIONWIDGET_H
#define CONVERSIONWIDGET_H
 
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QFileInfoList>
#include <QTextDocument>
#include <QPrinter>
#include <QPrintDialog>
#include <QMessageBox>
 
class ConversionWidget : public QWidget
{
 
  Q_OBJECT
 
  public:
    ConversionWidget();
    ~ConversionWidget();
 
  private slots:
    void convertHtmlToPdf();
    void chooseDirectory();
 
  private:
    QLineEdit *m_srcEdit,
              *m_destEdit;
    QPushButton *m_srcButton,
                *m_destButton,
                *m_convertButton,
                *m_quitButton;
 
};
 
#endif // CONVERSIONWIDGET_H
// ConversionWidget.cpp
#include "ConversionWidget.h"
 
ConversionWidget::ConversionWidget()
{
  m_srcEdit = new QLineEdit();
  m_destEdit = new QLineEdit();
  m_srcButton = new QPushButton( "Source" );
  m_destButton = new QPushButton( "Destination" );
  m_convertButton = new QPushButton( "Convert" );
  m_quitButton = new QPushButton( "Quit" );
 
  m_srcEdit->setDisabled( true );
  m_destEdit->setDisabled( true );
  m_convertButton->setDisabled( true );
  connect( m_srcButton, SIGNAL( clicked() ), this, SLOT( chooseDirectory() ) );
  connect( m_destButton, SIGNAL( clicked() ), this, SLOT( chooseDirectory() ) );
  connect( m_convertButton, SIGNAL( clicked() ), this, SLOT( convertHtmlToPdf() ) );
  connect( m_quitButton, SIGNAL( clicked() ), this, SLOT( close() ) );
 
  QVBoxLayout *vLayout = new QVBoxLayout();
  QHBoxLayout *hLayout = new QHBoxLayout();
  hLayout->addWidget( m_srcEdit );
  hLayout->addWidget( m_srcButton );
  vLayout->addLayout( hLayout );
  hLayout = new QHBoxLayout();
  hLayout->addWidget( m_destEdit );
  hLayout->addWidget( m_destButton );
  vLayout->addLayout( hLayout );
  vLayout->addStretch();
  hLayout = new QHBoxLayout();
  hLayout->addStretch();
  hLayout->addWidget( m_convertButton );
  hLayout->addWidget( m_quitButton );
  vLayout->addLayout( hLayout );
 
  setLayout( vLayout );
  resize( 450, 120 );
  setWindowTitle( "Html2Pdf" );
}
 
 
ConversionWidget::~ConversionWidget()
{
  delete m_quitButton;
  delete m_convertButton;
  delete m_destButton;
  delete m_srcButton;
  delete m_destEdit;
  delete m_srcEdit;
}
 
 
void ConversionWidget::convertHtmlToPdf()
{
  QStringList htmlFilter;
  htmlFilter << "*.html" << "*.htm";
  QFileInfoList fileList = QDir( m_srcEdit->text() ).entryInfoList( htmlFilter );
  QTextDocument document;
  QPrinter printer;
  printer.setPaperSize( QPrinter::A4 );
  printer.setFullPage( true );
  printer.setOrientation( QPrinter::Portrait );
  printer.setPrintRange( QPrinter::AllPages );
  printer.setOutputFormat( QPrinter::PdfFormat );
  foreach( const QFileInfo& fileInfo, fileList )
  {
    QFile file( fileInfo.filePath() );
    if( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
    {
      QMessageBox::critical( NULL, "Error", QString( "Error opening file: %1" ).arg( file.errorString() ), QMessageBox::Ok );
      return;
    }
    document.setHtml( file.readAll() );
    printer.setOutputFileName( m_destEdit->text() + "/" + fileInfo.baseName() + ".pdf" );
    document.print( &printer );
  }
}
 
 
void ConversionWidget::chooseDirectory()
{
  QString dir = QFileDialog::getExistingDirectory();
  if( !dir.isEmpty() )
  {
    if( sender() == m_srcButton )
      m_srcEdit->setText( dir );
    else if( sender() == m_destButton )
      m_destEdit->setText( dir );
    if( !m_srcEdit->text().isEmpty() && !m_destEdit->text().isEmpty() )
      m_convertButton->setEnabled( true );
  }
}

FIXME doku; Bilder werden nicht angezeigt