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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разделение стилей и документа при печати  (Прочитано 6839 раз)
radislav72
Гость
« : Январь 18, 2012, 21:35 »

Здравствуйте!

В папке приложения есть подпапка /templates, где расположены шаблоны для печати в формате html, и там же css- стили для задания внешнего вида таблиц, абзацев...

Пробую печатать с использованием QWebView + QPrintPreviewDialog. Но при усановке контента для QWebView css-стили не подгружаются. Делаю так:
Код:
wv->setHtml(sTemplate, QUrl(QApplication::applicationDirPath() + "/templates"));
Что не так?

Если стили добавить в сам html-шаблон, то все нормально. Но таких шаблонов много, и хотелось бы отделить оформление от их содержимого, чтобы одним css управлять всеми.

В оках по setHtml пишут, что
Цитировать
External objects such as stylesheets or images referenced in the HTML document are located relative to baseUrl

Как правильно задавать етот "baseUrl"?
« Последнее редактирование: Январь 19, 2012, 10:30 от radislav72 » Записан
radislav72
Гость
« Ответ #1 : Январь 19, 2012, 10:31 »

Урл типа file:///c:/Projects... тоже не проходит
Записан
_OLEGator_
Гость
« Ответ #2 : Январь 19, 2012, 11:09 »

Вам нужно установить URL WebView загружаемого шаблона, чтобы он относительно него нашел css.
Либо указать абсолютные пути к css перед вызовом setHtml.

А чем QWebView::load ( const QUrl & url ) не подходит?

Либо воспользоваться
Код
C++ (Qt)
void QWebFrame::setUrl ( const QUrl & url )
Записан
radislav72
Гость
« Ответ #3 : Январь 19, 2012, 12:08 »

Вам нужно установить URL WebView загружаемого шаблона, чтобы он относительно него нашел css.
Либо указать абсолютные пути к css перед вызовом setHtml.

А чем QWebView::load ( const QUrl & url ) не подходит?

Либо воспользоваться
Код
C++ (Qt)
void QWebFrame::setUrl ( const QUrl & url )
Спасибо за сочувствие Улыбающийся
Установить URL или использовать load неудобно, так как шаблоны содержат "метки" (placeholder's), которые программно заполняются нужными значениями- и только после етого текст шаблона устанавливается в WebView.
В самом шаблоне указать жесткие абсолютные ссылки на css также не хорошо, так как на разных компах программа может быть в разных папках... не говоря о разных ОС.

Путем рытья текста в Assistante нашел вроде бы выход:
Код:
wv->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile("print.css"));
Так работает (css загружается), но при одном условии- если файл css размещен в рабочей папке проги. Но если пробовать задавать не просто "print.css", а вычисленный относительно размещения программы абсолютный путь, то уже работать перестает:
Код:
wv->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile(QApplication::applicationDirPath() + "/templates/print.css"));
Хотя путь однозначно верный! Проверено и перепроверено Улыбающийся
Странное как по мне поведение... хотелось бы понять чего так.
Записан
_OLEGator_
Гость
« Ответ #4 : Январь 19, 2012, 13:37 »

Можно ставить такие же метки в шаблоне, которые заменять абсолютным путем.
Записан
radislav72
Гость
« Ответ #5 : Январь 19, 2012, 17:26 »

Можно ставить такие же метки в шаблоне, которые заменять абсолютным путем.
Можно, тоже подумывал о таком. Правда как-то казалось что должно быть "прямое" решение.

И еще одно выплыло: html-файл с подгруженными стилями css в QWebView выглядит СИЛЬНО не так как в браузере. В Firefox, IE, Chrome страница выглядит по-одному, а в QWebView и стиль таблц не тот, и даже шрифты. Такое впечатление, что он использует свои стили, которые "перетирают" заданные.

Может кто знает почему так и как сделать, чтоб отображение html было таким же, как в браузере. Ведь главная задумка- чтобы "продвинутые пользователи" могля сами редактировать стили и вид документа.
Записан
radislav72
Гость
« Ответ #6 : Январь 20, 2012, 17:38 »

Путем проб установлено, что лучше всего в шаблоне динамически перед отображением прописывать аблютный путь к файлу css.
А перед отображением диалога QPrintPreviewDialog вызывать QApplication::processEvents(). Иначе setHtml() не всегда срабатывает, хотя в доке пишут что html вроде загружается "immediality".

Т.е. в целом для предпросмотра работает такой код:
Код:
    QWebView *wv = new QWebView(this);
    QWebSettings::globalSettings()->setFontFamily(QWebSettings::StandardFont, "Times New Roman");
    wv->setHtml(sTemplate);
    QApplication::processEvents();

    QPrintPreviewDialog *printPreview;
    printPreview = new QPrintPreviewDialog(new QPrinter(QPrinter::HighResolution), this, Qt::Dialog);
    connect(printPreview, SIGNAL(paintRequested(QPrinter*)), wv, SLOT(print(QPrinter*)));

    QSettings settings("tb.ini", QSettings::IniFormat);
    settings.beginGroup("Geometry");
    printPreview->restoreGeometry(settings.value("PrintPreviewDialog").toByteArray());

    printPreview->exec();

    settings.setValue("PrintPreviewDialog", printPreview->saveGeometry());

    delete printPreview;
Записан
radislav72
Гость
« Ответ #7 : Январь 20, 2012, 18:00 »

Еще вопрос: может кто подскажет, а то уже утомился рыться в доках.
В окне предварительного просмотра перед печатью в заголовке пишется фраза типа "Предварительный просмотр: document1"

Как можно вместо document1 задать свое "цивилизованное" имя?

Т.е. как сам WindowTitle изменить, ясно- там можно любой текст записать. Но дело в том, что при печати на виртуальн. принтер все равно выскакивает название document1. Т.е., такое впечатление что где-то документу html присвоено какое-то название... Как его изменить?
« Последнее редактирование: Январь 21, 2012, 10:08 от radislav72 » Записан
radislav72
Гость
« Ответ #8 : Январь 22, 2012, 16:58 »

Как можно вместо document1 задать свое "цивилизованное" имя?

В настройках QPrinter Улыбающийся
Код:
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
printer->setDocName("Members");

Потом printer передать в QPrintPreviewDialog...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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