Russian Qt Forum

Qt => QSS => Тема начата: radislav72 от Январь 18, 2012, 21:35



Название: Разделение стилей и документа при печати
Отправлено: 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"?


Название: Re: Разделение стилей и документа при печати
Отправлено: radislav72 от Январь 19, 2012, 10:31
Урл типа file:///c:/Projects... тоже не проходит


Название: Re: Разделение стилей и документа при печати
Отправлено: _OLEGator_ от Январь 19, 2012, 11:09
Вам нужно установить URL WebView загружаемого шаблона, чтобы он относительно него нашел css.
Либо указать абсолютные пути к css перед вызовом setHtml.

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

Либо воспользоваться
Код
C++ (Qt)
void QWebFrame::setUrl ( const QUrl & url )


Название: Re: Разделение стилей и документа при печати
Отправлено: radislav72 от Январь 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"));
Хотя путь однозначно верный! Проверено и перепроверено :)
Странное как по мне поведение... хотелось бы понять чего так.


Название: Re: Разделение стилей и документа при печати
Отправлено: _OLEGator_ от Январь 19, 2012, 13:37
Можно ставить такие же метки в шаблоне, которые заменять абсолютным путем.


Название: Re: Разделение стилей и документа при печати
Отправлено: radislav72 от Январь 19, 2012, 17:26
Можно ставить такие же метки в шаблоне, которые заменять абсолютным путем.
Можно, тоже подумывал о таком. Правда как-то казалось что должно быть "прямое" решение.

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

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


Название: Re: Разделение стилей и документа при печати
Отправлено: radislav72 от Январь 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;


Название: Re: Разделение стилей и документа при печати
Отправлено: radislav72 от Январь 20, 2012, 18:00
Еще вопрос: может кто подскажет, а то уже утомился рыться в доках.
В окне предварительного просмотра перед печатью в заголовке пишется фраза типа "Предварительный просмотр: document1"

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

Т.е. как сам WindowTitle изменить, ясно- там можно любой текст записать. Но дело в том, что при печати на виртуальн. принтер все равно выскакивает название document1. Т.е., такое впечатление что где-то документу html присвоено какое-то название... Как его изменить?


Название: Re: Разделение стилей и документа при печати
Отправлено: radislav72 от Январь 22, 2012, 16:58
Как можно вместо document1 задать свое "цивилизованное" имя?

В настройках QPrinter :)
Код:
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
printer->setDocName("Members");

Потом printer передать в QPrintPreviewDialog...