Russian Qt Forum

Qt => Печать => Тема начата: Exception13 от Июль 29, 2009, 09:29



Название: распечатать виджет и его подвиджеты ?
Отправлено: Exception13 от Июль 29, 2009, 09:29
Созрел вопрос, связанный с печатью виджета и всего того, что в нем находится.
т.е. есть какой то виджет, внутрь него было понатыкано еще куча всяких кнопочек, лайоутов и прочей енрунды.

При помощи стандартного диалога QPrintPreviewDialog хочу сделать preview того, что должно отправиться на печать. Делаю я это стандартным образом, что описан в примерах qt.

QWidget *w_pMainWidget - внутренняя переменная класса TWidgetPrinter, просто для т.ч. запомнить указатель на тот виджет, который хочу распечатать.

Код
C++ (Qt)
void TWidgetPrinter::printPreview( QWidget *widget_ )
{
  w_pMainWidget = widget_;
  QPrinter printer;
  QPrintPreviewDialog preview( &printer, widget_ );
  connect( &preview, SIGNAL(paintRequested(QPrinter *) ),
                     this, SLOT(printDocument(QPrinter *)));
  preview.exec();
}
 
void TWidgetPrinter::printDocument( QPrinter *printer_ )
{
  if ( w_pMainWidget != NULL )
     w_pMainWidget->render( printer_ );
}
 

Но, на preview выводится почему то только один единственный виджет, который был последним при конструировании родительского виджета.
Если же в функцию printPreview передать указатель на к-либо простой виджет типа кнопки - то он нормально отрисовывается на preview.
Хотелось бы конечно чтобы отрисовывались все виджеты рекурсивно, начиная с указанного.
В документации к флагам используемым в функции render примерно так и написано:

QWidget::DrawChildren:
If you enable this option, the widget's children are rendered recursively into the target. By default, this option is enabled.

Но, что то никакой рекурсией не пахнет вовсе...
Имею следующий виджет:
(http://img193.imageshack.us/img193/7374/screen1khd.th.png) (http://img193.imageshack.us/i/screen1khd.png/)
а получаю вот это:
(http://img41.imageshack.us/img41/3368/screen2tcd.th.png) (http://img41.imageshack.us/i/screen2tcd.png/)

Что делать и как распечатать рекурсивно все элементы, входящие в виджет ?
Кто то наверняка уже сталкивался с подобной задачей...


Название: Re: распечатать виджет и его подвиджеты ?
Отправлено: spirit от Июль 29, 2009, 09:32
глянь вот этот метод QWidget::render.


Название: Re: распечатать виджет и его подвиджеты ?
Отправлено: Exception13 от Июль 29, 2009, 10:11
глянь вот этот метод QWidget::render.
собственно им и пользуюсь :)
в коде написал, и еще пояснение снизу дал...сам себя цитировать не стану :)

О, сделал маленький экскремент :) если перенаправить работу render на изображение, а не на принтер, то почему то все получается как надо...

Код
C++ (Qt)
void TWidgetPrinter::printDocument( QPrinter *printer_ )
{
  if ( w_pMainWidget != NULL )
     w_pMainWidget->render( printer_ );
 
     QPixmap pixmap(w_pMainWidget->size());
     w_pMainWidget->render(&pixmap);
     pixmap.toImage().save( "out2.png", "PNG" );
}
 
в чем юмор - до сих пор не понятно...