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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разный viewport на разных принтерах  (Прочитано 8282 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« : Март 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 рисовал одинаково?
« Последнее редактирование: Март 24, 2015, 08:19 от juvf » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Март 24, 2015, 10:19 »

QPainter.drawText(rigth/2,bottom/2, "Hello world!"); - в центре листа
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #2 : Март 24, 2015, 11:34 »

да, так будет в центре листа. Мне нужно отступить от центра 10 см и вывести туда картинку. Как это сделать? Методом подбора вычислил, что 10 см - это к примеру 5900.  Но на другом принтере 5900 - это не 10 см... картинка съехала.

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

Сообщений: 1175


Просмотр профиля
« Ответ #3 : Март 24, 2015, 13:17 »

Мне нужно отступить от центра 10 см и вывести туда картинку. Как это сделать?

размер листа известен, точек по высоте и ширине тоже известно, т.е. элементарно можно вычислить
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #4 : Март 24, 2015, 17:22 »

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

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

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

Сообщений: 1175


Просмотр профиля
« Ответ #5 : Март 25, 2015, 08:46 »

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

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

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

Записан
popper
Гость
« Ответ #6 : Март 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)
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #7 : Апрель 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
Невзлетело ((
« Последнее редактирование: Апрель 01, 2015, 06:41 от juvf » Записан
popper
Гость
« Ответ #8 : Апрель 02, 2015, 15:20 »

Код
C++ (Qt)
bool QPainter::begin ( QPaintDevice * device )
 
а у вас:
Код
C++ (Qt)
painter.begin(printer);

Наверное, нужно
Код
C++ (Qt)
painter.begin(&printer);
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #9 : Апрель 07, 2015, 08:54 »

Наверное, нужно
Код
C++ (Qt)
painter.begin(&printer);
Да, у меня так и есть..... просто копипастил из разных мест, делал компактно... опечатался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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