2014-10-10 2 views
3

Я пытаюсь получить программу печати изображений для работы в Qt. Попытка печати на пользовательский принтер, для которого есть ppd. Существуют расчеты, основанные на информации об устройстве, для создания изображения, которое должно быть отправлено на принтер.Решение QPrinter ошибочно в Linux

При взгляде на свойства принтера я вижу, что Resolution - 300 dpi x 300 dpi.

В окнах все работает нормально, но в Linux вычисляемая информация об изображении становится очень большой, что делает мои файлы взрывоопасными ... Просматривая все данные, я обнаружил, что в Linux physicalDpiX и physicalDpiY (используется при вычислении кода) в 1200 вместо 300.

Так что я виню его на QPrinter :: PrinterMode

QPrinter :: высокого разрешения 2 в Windows устанавливает разрешение принтера в , который определил для принтера. Для печати PostScript устанавливает разрешение драйвера PostScript на 1200 dpi.

Я изменил свой конструктор, чтобы заботиться о нем - только в случае, если по умолчанию не правы ... Это не сработало:

Printer::Printer(const QPrinterInfo& printerInfo, MainWindow* pWnd) : 
#if defined(Q_OS_WIN32) || defined (Q_MAC_OSX) 
    QPrinter(QPrinter::HighResolution) 
#else 
    QPrinter(QPrinter::ScreenResolution) 
#endif 
{ 
    qDebug()<<"printer resolution physicalDpiX="<< this->physicalDpiX()<<", physicalDpiY="<<this->physicalDpiY(); 
    // prints 1200 for each in Linux, 300 in windows 
    qDebug()<<"printer resolution="<< this->resolution(); 
    // prints 96 in Linux, 300 in windows 
    // printer properties (like from system-config-printer) show 300 
    // printerInfo.printerName() and printerInfo.defaultPrinter().printerName() show my printer 
} 

числа неверны для разрешения в Linux, но правильно в ОС Windows

Пробовал

this-> setResolution (300);

Это сделано.разрешение() становится 300, но физическийDpiX и Y показывают 1200 неподвижных.

QPrinter::supportedResolutions(), кажется, говорят, что дело безнадежно ...

Как мне сделать мой принтер увидеть разрешение, показанное в свойствах принтера?

Есть единственная надежда вытащить некоторые методы из чашек? Я пробовал ... Я не понимаю, как использовать единственную информацию, которую я нашел: cups Resolution

ответ

0

Насколько я хотел бы получить общий ответ на этот вопрос, на данный момент я решил проблему для конкретных драйверов, которые пользователь должен использовать, оставив по умолчанию (1200) для других, таких как печать в формате pdf или hp. ..

Мой заказ принтер содержит среди вариантов чашки, вариант резолюции, который выглядит как

name="printer-resolution" value="300x300dpi" 

я могу извлечь из него разрешение. Если этого конкретного параметра чашек не существует, то я могу использовать значение по умолчанию 1200.

3

Во-первых, никогда не полагайтесь на разрешение физических устройств. Пользователь может использовать принтеры с различными разрешениями, печатать один раз с одним разрешением (300 точек на дюйм), в следующий раз с другим разрешением (600 точек на дюйм) или распечатывать в PDF-файл, или открывать окно предварительного просмотра, в котором используется разрешение экрана. Во-вторых, используйте ScreenResolution только для печати на экране, для любого устройства с высоким разрешением это слишком грубо. Буквы и изображения будут уродливыми, а позиционирование на странице будет слишком низкой.

Печать независимо от физического разрешения устройства и операционной системы также может быть достигнута с помощью масштабирования QPainter. Насколько я знаю, базовое разрешение QPainter составляет 1200 точек на дюйм. Это означает, что это лучшее разрешение, которое может печатать Qt. В следующем примере показано, как настроить масштабирование перед рисованием любого содержимого на странице.

QPrinter printer(QPrinter::HighResolution); 
qreal resolutionFactor = 1200/printer->resolution(); 
QPainter painter; 
painter.begin(&printer); 
painter.scale(1/resolutionFactor, 1/resolutionFactor); 
printPage(&painter); // This method should implement printing itself 
painter.end(); 

Затем осуществить содержимое чертежа (набор х и у координаты, ширину и высоту для изображений и т.д.) для разрешения базового QPainter от 1200dpi и процесс рендеринга будет заботиться о том, все размеры будут автоматически масштабировать до разрешающей способности целевого устройства.

+0

Что вы говорите красиво - к сожалению, оно работает только в Windows. Печать на нескольких устройствах, каждая со своим разрешением, требует, чтобы система могла распознавать разрешение. Тот факт, что печать Qt неспособна распознать разрешение пользователя/устройства, приводит к таким проблемам, как мой: пока принтер поддерживает только 300 (принтер с очень крупным масштабом, который работает с гигантскими изображениями), система попытается обработать что-то в 16 раз больше , что приводит к работам, которые превышают доступную память (и даже дисковое пространство на определенных системах). – Thalia

+0

Но ... Ваш фрагмент кода также зависит от разрешения устройства ... К сожалению, он не работает, так как «printer-> resolution()» неверно тоже – Thalia

+0

Значение QPrinter :: resolution() устанавливается драйвером, и если драйвер Linux всегда возвращает 1200, я предполагаю, что он дополнительно масштабирует содержимое до физического разрешения. Я просто попытался напечатать что-то из Qt-кода на Windows и Linux (OpenSUSE, лазерный принтер Samsung), и в обоих случаях я получил одинаковый размер вывода на бумаге. Это правда, что resolution() возвращает 1200 на Linux, даже если я печатаю в 600 dpi, но, как я уже сказал, я получаю правильный вывод на бумаге. – user645859

Смежные вопросы