Russian Qt Forum
Ноябрь 22, 2024, 17:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: распечатать виджет и его подвиджеты ?  (Прочитано 6084 раз)
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.

Но, что то никакой рекурсией не пахнет вовсе...
Имею следующий виджет:

а получаю вот это:


Что делать и как распечатать рекурсивно все элементы, входящие в виджет ?
Кто то наверняка уже сталкивался с подобной задачей...
Записан
spirit
Гость
« Ответ #1 : Июль 29, 2009, 09:32 »

глянь вот этот метод QWidget::render.
Записан
Exception13
Гость
« Ответ #2 : Июль 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" );
}
 
в чем юмор - до сих пор не понятно...
« Последнее редактирование: Июль 29, 2009, 10:36 от Exception13 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 20.