2017-04-20 14 views
0

私はqwidgetsを別々のページにそれぞれレンダリングして、pdf形式で保存しようとしています。私はQPainterの、Qprinterを使用してみましたし、フォーラムで提案されているようにレンダリングしてみました:http://doc.qt.io/qt-4.8/printing.html#printing-widgetsQpainterを使用して複数のqwidgetsを異なるページのpdfに印刷する方法は?

これは私のサンプルコードです:私は上記のコードを実行すると

QPainter painter; 
painter.begin(&printer); 
for(int page = 0;page<no_of_pages;page++) 
{ 
double xscale = printer.pageRect().width()/double(MyWidget[page]->width()); 
double yscale = printer.pageRect().height()/double(MyWidget[page]->height()); 
double scale = qMin(xscale, yscale); 
painter.translate(printer.paperRect().x() + printer.pageRect().width()/2, 
printer.paperRect().y() + printer.pageRect().height()/2); 
painter.scale(scale, scale); 
painter.translate(-MyWidget[page]->width()/2, -MyWidget[page]->height()/2); 
MyWidget[page]->render(&painter); 
if(page!=(no_of_pages-1)) 
    printer.newPage(); 
} 
painter.end(); 

、PDFは内のページの正確な数で生成されます最初のページだけが印刷されます。私は、アプリケーションの出力コンソールをチェックすると、以下のメッセージが印刷されています

QPainter::begin: Paint device returned engine == 0, type: 2 
QPainter::setRenderHint: Painter must be active to set rendering hints 
QPainter::setWorldTransform: Painter not active 
QWidget::render: Cannot render with an inactive painter 
QPainter::end: Painter not active, aborted 

私は、これらのメッセージをGoogleしようとしたが、それらのどれもqwidgetsのレンダリングに関連していません。どんな助けもありがとうございます。ありがとうございました。

答えて

1

問題は、次のページには印刷されませんが、縮尺が正しくないため、各繰り返しの最後にresetTransform()を使用してすべての変換をリセットする必要があります。私はQList <QWidget *>のウィジェットを保存することをお勧めします。

QList <QWidget *> widgets; 
widgets.append({some widget}); 
[...] 

QPrinter printer; 
printer.setOutputFormat(QPrinter::PdfFormat); 
printer.setOutputFileName("printer.pdf"); 

QPainter painter; 

if (! painter.begin(&printer)) { // failed to open file 
    qWarning("failed to open file, is it writable?"); 
} 

for(auto widget: w){ 
    if(widget){ 
     if(widget->width() > 0 && widget->height() >0){ 

      qreal xscale = 0.9*printer.pageRect().width()/qreal(widget->width()); 
      qreal yscale = 0.9*printer.pageRect().height()/qreal(widget->height()); 

      qreal scale = qMin(xscale, yscale); 

      painter.translate(printer.paperRect().x() + printer.pageRect().width()/2, 
           printer.paperRect().y() + printer.pageRect().height()/2); 

      painter.scale(scale, scale); 
      painter.translate(-width()/2, -height()/2); 
      widget->render(&painter); 
      painter.resetTransform(); 
      if(widget != widgets.last()) 
       printer.newPage(); 
     } 
    } 

} 
painter.end(); 

観測:画像がより快適に表示されるように係数を0.9に設定します。

+0

それは働いた。あなたは私の日を救ってくれてありがとう。あなたの答えを受け入れました。 – Pramod

関連する問題