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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWebView print  (Прочитано 9419 раз)
Ph
Гость
« : Октябрь 28, 2009, 09:25 »

Вывожу на печать из QwebView

Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=cp-1251" />

<style type="text/css" title="currentStyle">
  BODY {
        width:   180mm;
        border:  1px solid black;
   }

</style>
</head>

<body>
123
</body>

</html>


с помощью

Код:
        QPrinter printer;
        QPrintPreviewDialog printDialog(&printer);
        printDialog.printer()->setPaperSize(QPrinter::A4);
        printDialog.printer()->setOrientation(QPrinter::Portrait);
        printDialog.printer()->setPageMargins(10.0,10.0,10.0,10.0,QPrinter::Millimeter);
        printDialog.printer()->setFullPage(true);
        connect(&printDialog, SIGNAL(paintRequested(QPrinter *)), m_ui->webView, SLOT(print(QPrinter *)));
        printDialog.exec();

в итоге получаю что у меня уменьшенный размер html страницы, например ширина рамки на листе равна не 180мм, а 143мм, а мне надо к примеру именно 180мм, подскажите что я не так делаю???
Записан
Ph
Гость
« Ответ #1 : Ноябрь 02, 2009, 08:29 »

Сделал так
Код:
void Dialog::on_pushButton_clicked()
{
    QPrinter printer;
    QPrintPreviewDialog printDialog(&printer);
    printDialog.printer()->setPaperSize(QPrinter::A4);
    printDialog.printer()->setOrientation(QPrinter::Portrait);
    printDialog.printer()->setPageMargins(0.0,0.0,0.0,0.0,QPrinter::Millimeter);
    printDialog.printer()->setFullPage(false);
    connect(&printDialog, SIGNAL(paintRequested(QPrinter *)), this, SLOT(pprew(QPrinter *)));
    printDialog.exec();
}

void Dialog::pprew(QPrinter *prnt)
{
  QPainter painter(prnt);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::darkGreen);
    painter.drawRect(0, 0,prnt->paperSize(QPrinter::Point).width(), prnt->paperSize(QPrinter::Point).height());
}

получаю то что во вложении, по идее прямоугольник должен быть по размеру страницы, но он не есть таковой, подскажите что мне делать???
Записан
Ph
Гость
« Ответ #2 : Ноябрь 02, 2009, 11:53 »

Добавил
Код:
printDialog.printer()->setResolution(72);

Зеленый прямоугольник начал рисоваться необходимого размера, но при этом если печатать из QwebView то ничего не печатается, пустой белый лист. Неужели никто не поможет???
Записан
villager
Гость
« Ответ #3 : Ноябрь 03, 2009, 00:07 »

у меня те же проблемы, голову ломаю, как получить точную печать html
ответа нет Улыбающийся
а может написать html2pdf ?
и точную печать, и хедеры/футеры...на форуме вопросов не решенных куча...
Записан
Ph
Гость
« Ответ #4 : Ноябрь 05, 2009, 08:26 »

Нашел в qwebframe.cpp
Код:
void QWebFrame::print(QPrinter *printer) const
{
    QPainter painter;
    if (!painter.begin(printer))
        return;

    const qreal zoomFactorX = printer->logicalDpiX() / qt_defaultDpi();
    const qreal zoomFactorY = printer->logicalDpiY() / qt_defaultDpi();

    PrintContext printContext(d->frame);
    float pageHeight = 0;

    QRect qprinterRect = printer->pageRect();

    IntRect pageRect(0, 0,
                     int(qprinterRect.width() / zoomFactorX),
                     int(qprinterRect.height() / zoomFactorY));

а вот где находится
Код:
qt_defaultDpi();

видимо от которого зависит правильный размер выводимой страницы найти немогу
Записан
Ph
Гость
« Ответ #5 : Ноябрь 05, 2009, 09:41 »

Выяснил вот что, если сделать как в qwebframe.cpp
Код:
    const qreal zoomFactorX = printer->logicalDpiX() / qt_defaultDpi();
    const qreal zoomFactorY = printer->logicalDpiY() / qt_defaultDpi();

а потом все это вывести
Код:
qDebug("zoomFactorX %f", zoomFactorX);
то в итоге получаем zoomFactorX 0.000000
а дальше у нас идет
Код:
 IntRect pageRect(0, 0,
                     int(qprinterRect.width() / zoomFactorX),
                     int(qprinterRect.height() / zoomFactorY));

в итоге деление на 0, и в итоге ничего не работает Улыбающийся
Записан
Ph
Гость
« Ответ #6 : Ноябрь 05, 2009, 09:49 »

По идее чтобы работало надо сделать в qwebframe.cpp

не
Код:
const qreal zoomFactorX = printer->logicalDpiX() / qt_defaultDpi();
а
Код:
const qreal zoomFactorX = (qreal)printer->logicalDpiX() / (qreal)qt_defaultDpi();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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