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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPrintPreviewDialog и html документ, теряется выравнивание.  (Прочитано 7729 раз)
n4ela
Гость
« : Февраль 08, 2010, 23:30 »

Есть html документ, который хотелось перед распечаткой посмотреть QPrintPreviewDialog.
Весь документ хранится в QString, помещаю его в QTextDocument как html. И если его сразу отправить на печать, то печатается отлично( проверял пока что только на печать в pdf ) вот так все работает:
Код
C++ (Qt)
   QPrinter printer;
   QTextDocument *doc = new QTextDocument( this );
   doc->setHtml( document );
 
   QPrintDialog *dlg = new QPrintDialog(&printer, this);
   if (dlg->exec() != QDialog::Accepted)
       return;
   doc->print( &printer );
 
Но если я хочу посмотреть на документ через предпросмотор то там он отображается не верно, игнорируется выравнивание текста, например если текст выравнен по центру, он все равно сместится к левому краю.
Код у меня такой:
Код
C++ (Qt)
   QPrinter printer;
   QPrintPreviewDialog *ppd = new QPrintPreviewDialog( &printer, this );
   connect( ppd, SIGNAL(paintRequested(QPrinter *) ),
            this, SLOT(printDocument(QPrinter*)));
 
   ppd->exec();
}
void Statement::printDocument(QPrinter* printer)
{
   QTextDocument *doc = new QTextDocument( this );
   doc->setHtml( document );
   QPainter painter;
   painter.begin(printer);
   doc->drawContents(&painter);
   painter.end();
}
 
+ ко всему если в окне предпросмотра нажать на печать и отпечатать документ в пдф, то pdf файл сохранится, а программа вылетит в сегфолт.
Записан
Marat(Qt)
Гость
« Ответ #1 : Апрель 12, 2010, 19:03 »

Если еще актуально или хотя бы интересно кому-нибудь: переменная printer во втором коде локальная, она уничтожается после завершения выполнения функции, поэтому после завершения работы диалога данные отправляются уничтоженному объекту - отсюда сегфолт. Вероятно с этим связаны и остальные проблемы.
Записан
BRE
Гость
« Ответ #2 : Апрель 12, 2010, 19:08 »

Если еще актуально или хотя бы интересно кому-нибудь: переменная printer во втором коде локальная, она уничтожается после завершения выполнения функции, поэтому после завершения работы диалога данные отправляются уничтоженному объекту - отсюда сегфолт. Вероятно с этим связаны и остальные проблемы.
Ты уверен?  Подмигивающий
Записан
Marat(Qt)
Гость
« Ответ #3 : Апрель 12, 2010, 20:02 »

Ты уверен?  Подмигивающий
В актуальности нет, в локальности переменной - да Подмигивающий
Записан
BRE
Гость
« Ответ #4 : Апрель 12, 2010, 20:06 »

В актуальности нет, в локальности переменной - да Подмигивающий
В причине?  Подмигивающий
Записан
Marat(Qt)
Гость
« Ответ #5 : Апрель 12, 2010, 20:27 »

В причине?  Подмигивающий
Причина сегфолта, на мой взгляд, очевидна. Мы работаем не с тем сегментом памяти, а это ошибка сегментирования. С вопросом форматирования не все так тривиально, но рассматривать его стоит только после "глобализации" переменной printer или её создания оператором new.
Подобные ошибки у меня бывали с моделями для QTableView. Я их создавал локально, прикреплял методом setModel и получал совершенно непредсказуемую программу.
Усомниться в причине может любитель питона. В питоне мы создаем объект локально, закрепляем его за родителем (например layout.addWidget(w)) и он спокойно функционирует. Но питон это не C++
Записан
BRE
Гость
« Ответ #6 : Апрель 12, 2010, 20:30 »

Причина сегфолта, на мой взгляд, очевидна. Мы работаем не с тем сегментом памяти, а это ошибка сегментирования. С вопросом форматирования не все так тривиально, но рассматривать его стоит только после "глобализации" переменной printer или её создания оператором new.
Подобные ошибки у меня бывали с моделями для QTableView. Я их создавал локально, прикреплял методом setModel и получал совершенно непредсказуемую программу.
Усомниться в причине может любитель питона. В питоне мы создаем объект локально, закрепляем его за родителем (например layout.addWidget(w)) и он спокойно функционирует. Но питон это не C++
Что бы много не писать, посмотри пример fontsampler из Qt.
Там используется примерно такой же кусок кода (с локальным QPrinter) для работы с QPrintPreviewDialog, поэкспериментируй. Обрати внимание как он активируется (exec()), когда будет отсылаться сигнал paintRequested.
« Последнее редактирование: Апрель 12, 2010, 20:32 от BRE » Записан
BRE
Гость
« Ответ #7 : Апрель 12, 2010, 20:38 »

Причина сегфолта, на мой взгляд, очевидна. Мы работаем не с тем сегментом памяти, а это ошибка сегментирования. С вопросом форматирования не все так тривиально, но рассматривать его стоит только после "глобализации" переменной printer или её создания оператором new.
Ты заблуждаешься.  Подмигивающий

Подобные ошибки у меня бывали с моделями для QTableView. Я их создавал локально, прикреплял методом setModel и получал совершенно непредсказуемую программу.
Да, такие ошибки допускают, но это не тот случай.

Усомниться в причине может любитель питона. В питоне мы создаем объект локально, закрепляем его за родителем (например layout.addWidget(w)) и он спокойно функционирует. Но питон это не C++
Разберись с вопросом.  Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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