Russian Qt Forum

Qt => Печать => Тема начата: n4ela от Февраль 08, 2010, 23:30



Название: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: 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 файл сохранится, а программа вылетит в сегфолт.


Название: Re: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: Marat(Qt) от Апрель 12, 2010, 19:03
Если еще актуально или хотя бы интересно кому-нибудь: переменная printer во втором коде локальная, она уничтожается после завершения выполнения функции, поэтому после завершения работы диалога данные отправляются уничтоженному объекту - отсюда сегфолт. Вероятно с этим связаны и остальные проблемы.


Название: Re: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: BRE от Апрель 12, 2010, 19:08
Если еще актуально или хотя бы интересно кому-нибудь: переменная printer во втором коде локальная, она уничтожается после завершения выполнения функции, поэтому после завершения работы диалога данные отправляются уничтоженному объекту - отсюда сегфолт. Вероятно с этим связаны и остальные проблемы.
Ты уверен?  ;)


Название: Re: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: Marat(Qt) от Апрель 12, 2010, 20:02
Ты уверен?  ;)
В актуальности нет, в локальности переменной - да ;)


Название: Re: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: BRE от Апрель 12, 2010, 20:06
В актуальности нет, в локальности переменной - да ;)
В причине?  ;)


Название: Re: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: Marat(Qt) от Апрель 12, 2010, 20:27
В причине?  ;)
Причина сегфолта, на мой взгляд, очевидна. Мы работаем не с тем сегментом памяти, а это ошибка сегментирования. С вопросом форматирования не все так тривиально, но рассматривать его стоит только после "глобализации" переменной printer или её создания оператором new.
Подобные ошибки у меня бывали с моделями для QTableView. Я их создавал локально, прикреплял методом setModel и получал совершенно непредсказуемую программу.
Усомниться в причине может любитель питона. В питоне мы создаем объект локально, закрепляем его за родителем (например layout.addWidget(w)) и он спокойно функционирует. Но питон это не C++


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


Название: Re: QPrintPreviewDialog и html документ, теряется выравнивание.
Отправлено: BRE от Апрель 12, 2010, 20:38
Причина сегфолта, на мой взгляд, очевидна. Мы работаем не с тем сегментом памяти, а это ошибка сегментирования. С вопросом форматирования не все так тривиально, но рассматривать его стоит только после "глобализации" переменной printer или её создания оператором new.
Ты заблуждаешься.  ;)

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

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