Russian Qt Forum

Qt => Печать => Тема начата: juvf от Март 24, 2015, 08:17



Название: Разный viewport на разных принтерах
Отправлено: juvf от Март 24, 2015, 08:17
Код:
  QPinter *printer = new QPinter(QPrinter::HighResolution); 
        printer->setPageOrientation(QPageLayout::Landscape);
        printer->setPageSize(QPrinter::A4);
 message(QString("resol 1 = %1").arg(printer.resolution()));
QPainter painter;
    painter.begin(printer);
    QRect viewport = painter.viewport();
    message( QString("painter.viewport(): left = %1\nrigth = %2\ntop = %3\nbottom = %4\n")
                     .arg(viewport.left())
                     .arg(viewport.right())
                     .arg(viewport.top())
                     .arg(viewport.bottom()));
    painter.end();

На разных принтерах разный вывод.  Например при печати в пдф вывод такой
Цитировать
resol 1 = 600
painter.viewport(): left = 0
rigth = 13698
top = 0
bottom = 9582
при печати на принтер вывод такой
Цитировать
resol 1 = 600
painter.viewport(): left = 0
rigth = 7016
top = 0
bottom = 4957
При печати на другой принтер вывод такой
Цитировать
resol 1 = 1200
painter.viewport(): left = 0
rigth = 13698
top = 0
bottom = 9582


Соответственно если написать текст
Код:
QPainter.drawText(1000,3000, "Hello world!");
то на один принтер вылезет текст в одном месте листа А4, а на другом принтере в другом месте. И причем размер шрифта при этом на обоих принтерах будет одинаковый, только координаты в разных местах. Пробовал применить QPainter::scale()... не вышло.... лини стал рисовать правильно, и текст стал в нужном месте, но размер текста изменился.

Почем так происходить и как это исправить? Как сделать, чтоб на всех принтерах  QPainter рисовал одинаково?


Название: Re: Разный viewport на разных принтерах
Отправлено: qate от Март 24, 2015, 10:19
QPainter.drawText(rigth/2,bottom/2, "Hello world!"); - в центре листа


Название: Re: Разный viewport на разных принтерах
Отправлено: juvf от Март 24, 2015, 11:34
да, так будет в центре листа. Мне нужно отступить от центра 10 см и вывести туда картинку. Как это сделать? Методом подбора вычислил, что 10 см - это к примеру 5900.  Но на другом принтере 5900 - это не 10 см... картинка съехала.

пока сделал заплатку, пересчитал масштаб для координат и применяю его во всех координатах QPainter::draw.... Но это костыль какой-то.   


Название: Re: Разный viewport на разных принтерах
Отправлено: qate от Март 24, 2015, 13:17
Мне нужно отступить от центра 10 см и вывести туда картинку. Как это сделать?

размер листа известен, точек по высоте и ширине тоже известно, т.е. элементарно можно вычислить


Название: Re: Разный viewport на разных принтерах
Отправлено: juvf от Март 24, 2015, 17:22
размер листа известен, точек по высоте и ширине тоже известно, т.е. элементарно можно вычислить

Ну я говорю, тут только на костылях.
Цитировать
пока сделал заплатку, пересчитал масштаб для координат и применяю его во всех координатах QPainter::draw....
Для каждого принтера свой размер точек для размера листа А4. А почему? я понимаю, если dpi 600 и dpi 1200 - тут по разрешению принтера можно определить кол-во точек. Но при одинаково разрешении разное кол-во точек.
приходиться для каждого принтера нужно вводить свой поправочный коэфф и по нему пересчитывать размеры.

ps. размер листа не известен. На одном принтере отступы от края 1 см, на другом 2 мм.  Как получить в см размер области печати?


Название: Re: Разный viewport на разных принтерах
Отправлено: qate от Март 25, 2015, 08:46
Ну я говорю, тут только на костылях.
ps. размер листа не известен. На одном принтере отступы от края 1 см, на другом 2 мм.  Как получить в см размер области печати?

принтеры не обязаны иметь одинаковое количество точек на А4 даже при 600dpi - тут все зависит от драйвера - как он сказал сколько точек будет, столько и будет
и это правильно вычислять размер не по точкам, а относительно ширины и высоты
костыль - это жестко привязаться к количеству точек

"железные" отступы от края наверно qt не скажет, надо на уровне ОС искать



Название: Re: Разный viewport на разных принтерах
Отправлено: popper от Март 26, 2015, 12:16

Цитировать
пока сделал заплатку, пересчитал масштаб для координат и применяю его во всех координатах QPainter::draw....
Для каждого принтера свой размер точек для размера листа А4. А почему? я понимаю, если dpi 600 и dpi 1200 - тут по разрешению принтера можно определить кол-во точек. Но при одинаково разрешении разное кол-во точек.
приходиться для каждого принтера нужно вводить свой поправочный коэфф и по нему пересчитывать размеры.

ps. размер листа не известен. На одном принтере отступы от края 1 см, на другом 2 мм.  Как получить в см размер области печати?

void QPrinter::getPageMargins(qreal * left, qreal * top, qreal * right, qreal * bottom, Unit unit) const
void QPrinter::setPageMargins(qreal left, qreal top, qreal right, qreal bottom, Unit unit)


Название: Re: Разный viewport на разных принтерах
Отправлено: juvf от Апрель 01, 2015, 06:31
void QPrinter::getPageMargins(qreal * left, qreal * top, qreal * right, qreal * bottom, Unit unit) const
void QPrinter::setPageMargins(qreal left, qreal top, qreal right, qreal bottom, Unit unit)
Код:

QPrinter printer(QPrinter::HighResolution);
printer.setPageMargins( QMarginsF(0, 0, 5000, 2000), QPageLayout::Point);
       ...
QPainter painter;
painter.begin(printer);
QRect viewport = painter.viewport();
message( QString("painter.viewport(): left = %1\nrigth = %2\ntop = %3\nbottom = %4\n")
                     .arg(viewport.left())
                     .arg(viewport.right())
                     .arg(viewport.top())
                     .arg(viewport.bottom()));


QRect windowPort = painter.window();
    message( QString("painter.window(): left = %1\nrigth = %2\ntop = %3\nbottom = %4\n")
                     .arg(windowPort.left())
                     .arg(windowPort.right())
                     .arg(windowPort.top())
                     .arg(windowPort.bottom()));

.......
}
Вывод
Цитировать
painter.viewport(): left = 0
rigth = 13565
top = 0
bottom = 9449

painter.window(): left = 0
rigth = 13565
top = 0
bottom = 9449
Невзлетело ((


Название: Re: Разный viewport на разных принтерах
Отправлено: popper от Апрель 02, 2015, 15:20
Код
C++ (Qt)
bool QPainter::begin ( QPaintDevice * device )
 
а у вас:
Код
C++ (Qt)
painter.begin(printer);

Наверное, нужно
Код
C++ (Qt)
painter.begin(&printer);


Название: Re: Разный viewport на разных принтерах
Отправлено: juvf от Апрель 07, 2015, 08:54
Наверное, нужно
Код
C++ (Qt)
painter.begin(&printer);
Да, у меня так и есть..... просто копипастил из разных мест, делал компактно... опечатался.