Russian Qt Forum

Qt => Печать => Тема начата: zoro86 от Сентябрь 15, 2010, 10:02



Название: очередь печати и как с ней быть..:-)
Отправлено: zoro86 от Сентябрь 15, 2010, 10:02
Тут такое дело... в Терминальной программе(для АСО)

У меня есть принтер CUSTOM-VKP80, он у меня установлен как Windows принтер через usb порт..

вот так я отправляю на печать
Код:
bool MainWindow::go_to_print(const QString &str,bool preview)
{

#ifndef QT_NO_PRINTER
    QPrinter printer(QPrinter::HighResolution);

    int vrmWidth = configMap["width_chec"]["value"].toInt();
    int vrmHeight = configMap["height_chec"]["value"].toInt();
    int vrmLeftMargin = configMap["left_margin_chec"]["value"].toInt();
    int vrmTopMargin = configMap["top_margin_chec"]["value"].toInt();
    int vrmRightMargin = configMap["right_margin_chec"]["value"].toInt();
    int vrmBottomMargin = configMap["bottom_margin_chec"]["value"].toInt();

    printer.setPaperSize(QSizeF(vrmWidth,vrmHeight),QPrinter::Millimeter);
    qreal left = vrmLeftMargin;
    qreal top = vrmTopMargin;
    qreal right = vrmRightMargin;
    qreal bottom = vrmBottomMargin;
    printer.setPageMargins(left,top,right,bottom,QPrinter::Millimeter);

    textBrowser->setText(str);

        textBrowser->print(&printer);

#endif
        return true;

}


все работает нормально и печатает...

хотел сделать следующее ... перед отправкой на печать проверяю есть ли бумага...
Код:
int MainWindow::get_status_from_printer()
{
    int sts = 0;
#ifndef QT_NO_PRINTER
    QPrinter printer(QPrinter::HighResolution);
    sts = printer.printerState();

#endif
    return sts;
}

тут он всегда возвращает 0... чтобы не случилось

поэтому я отправляю всегда на печать чек от каждого платежа, соответсвенно если кончается бумага то очередь накапливается большая...

ВОТ ПЕРВЫЙ ВОПРОС КАК УБИВАТЬ ДАННУЮ ОЧЕРЕДЬ...??

в свойствах принтера нашел печать на прамую в принтер...(тоесть не в очередь), опять таки при отсутствии бумаги прога при отправки на печать полностью зависает на несколько минут...

КАК БЫТЬ И ЧТО Я ДЕЛАЮ НЕ ТАК..??


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Denjs от Сентябрь 15, 2010, 11:46
Имхо - первое что вы делаете не так - это работаете с принтером через виндоус драйвера. А остальное - следствие этой ошибки.

С принтерами чеков, надо пользоваться не виндоус-драйверами, а специализированными подсистемами печати на них ориентированными. Драйверами или т.п. Атолл например выпускает таковые, или смотрите ко мне в подпись)))

Другой вариант - работать с принтером напрямую (например через ком-порт, который для USB - виртуальный). Язык управления принтером - ESC/POS, описан много где. Компоненты для QT для работы с ком-портом тоже есть.

Стандартные вынь-дравера печати вам много чего не дадут в отношении промышленного оборудования.

Смотрите ко мне в подпись, если что обращайтесь, по работе с принтером напрямую - мог вам помочь.

__________________
если же хотите ковыряться с очередью печати - то думаю тут вам только доблестное изучение WinAPI поможет.


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: zoro86 от Сентябрь 15, 2010, 12:09
дело в том что мне пока для Windows надо...
И комплектация терминалов тоже разная... некоторые приходят с COM-кабелями а некоторые с USB поэтому стоит задача чтобы работать можно было с любыми...

У меня у же есть около 4-ч протоколов для работы с принтерами... они работают нормально... и статусы получают и так далее..

но вот с драйвером виндовс не могу разобраться...

вот по поводу WinApi можете сылочку дать... или идейку еще какую нить..


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Denjs от Сентябрь 15, 2010, 13:40
И комплектация терминалов тоже разная... некоторые приходят с COM-кабелями а некоторые с USB поэтому стоит задача чтобы работать можно было с любыми...
USB-шные принтеры все ранво реализуют профиль последовательного устройства который подхватывается драйвером виртуального ком-порта для виндоус (если принтер нормальный конечно... что могут придумать china-производители я боюсь представить). В рамках данного виртуального компорта обмен не должен отличаться от обмена с устройством которое подключено на физический последовательный порт.

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

В случае отказа от вынь дравера - вам также придется менять технологии подготовки изображения.
Никаких QPrinter и т.п. : вы руками готовите последовательность команд(при прямой работе с портом), или готовите html-строку с текстом (в случае моего драйвера OTPD (http://developer.berlios.de/projects/otpd/)) или руками вызываете API-функции библиотеки-драйвера (в случае АТОЛ: Драйвер принтеров чеков (http://www.atol.ru/products/programs/special/driver/driver-chek/))

Признаться работать с моим драйвером в промышленном режиме я бы пока не рекомендовал. Если только с некоторой отладкой тестированием - если вы в Москве - я мог помочь лично. Если хотите поиграться с моими драйверами - лучше скачивайте все в комлекте с сайта QDroid - т.е. сорсы QDroid - там OTPD поновее будет.
Также я могу помочь вам с ESC/POS-последовательностями.

С WinAPI я вам помочь не смогу.


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: zoro86 от Сентябрь 16, 2010, 06:17
Понятно спс большущее... буду копать...

Вот вам сылочка на терминальный проект под версией 2 от кибер-плата... у них там все принтаки перечислены может разберетесь...

http://dev.cyberplat.com/redmine/repositories/show/pt (http://dev.cyberplat.com/redmine/repositories/show/pt)

лично я писал с нуля... использовал библиотеку qserialdevice которую любезно предоставил и направил на истенный путь   kuzulis...


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Denjs от Сентябрь 16, 2010, 11:24
гм... так я не понял. вы сейчас с помощью QPrinter напечать отправляете через виндовые драйвера, или руками через qserialdevice  ?

первый пост не согласуется с последним...

за ссылку спасибо. посмотрим на досуге.


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: zoro86 от Сентябрь 17, 2010, 13:43
Тут такое дела что привозят терминалы как с принтерами подключенные через СОМ-порт так и с принтерами подключенными через USB.
С принтерами которые идут через СОМ я разобрался ... накатал для каждого отдельный класс и так далее... сделал определялку... в зависимости от найденного принтера подгружает соответствующий класс для работы с данным принтером...

Осталось разобраться с теми принтерами которые приходят подключенными через USB...

вот бы эти очереди очищать научится.. как надо будет... ;)


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Denjs от Сентябрь 17, 2010, 16:42
С принтерами которые идут через СОМ я разобрался ... накатал для каждого отдельный класс и так далее... сделал определялку...
Осталось разобраться с теми принтерами которые приходят подключенными через USB...
Попробуйте поставить драйвер-виртуального ком-порта для ваших принтеров. Оно должно быть на сайте производителя или у поставщика где-нибудь в разделе драйверов.
Ещё подобное должно поставляться в составе атоловских драйверов принтеров чеков.
Потом на него натаскивайте ваши классы.


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: maxxant от Сентябрь 28, 2010, 18:35
Цитировать
Код:
int MainWindow::get_status_from_printer()
{
    int sts = 0;
#ifndef QT_NO_PRINTER
    QPrinter printer(QPrinter::HighResolution);
    sts = printer.printerState();

#endif
    return sts;
}

тут он всегда возвращает 0... чтобы не случилось


если посмотреть в исходники Qt, то можно увидеть, что printerState() имеет мало общего с настоящим состоянием принтера.
Это состояние меняется внутри самой функции textBrowser->print(&printer) и, видимо, предназначено для собственных реализаций подобных функций. У нас состояние принтера и управление очередью печати реализуется через свои платформо-зависимые костыли.


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Magvaj от Сентябрь 29, 2010, 11:12
Попробуйте поставить драйвер-виртуального ком-порта для ваших принтеров. Оно должно быть на сайте производителя или у поставщика где-нибудь в разделе драйверов.
Ещё подобное должно поставляться в составе атоловских драйверов принтеров чеков.
Потом на него натаскивайте ваши классы.

Для принтеров Custom VKP, StarTUP и Zebra драйверов виртуального порта нет. И сесли интерфейс COM отсутствует- только через QPrinter и стандартные дрова.


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Denjs от Сентябрь 29, 2010, 12:49
Для принтеров Custom VKP, StarTUP и Zebra драйверов виртуального порта нет. И сесли интерфейс COM отсутствует- только через QPrinter и стандартные дрова.
... гы... просто интересно - а если их в линуксу подключить  - стандартный драйвер ком-профиля usb-порта узнает их? кабельки там разные узнает на ура)


Название: Re: очередь печати и как с ней быть..:-)
Отправлено: Magvaj от Сентябрь 30, 2010, 07:45
гы... просто интересно - а если их в линуксу подключить  - стандартный драйвер ком-профиля usb-порта узнает их? кабельки там разные узнает на ура)

для линухи пользуюсь стандартными COM или LPT. Если принтер USB, то работают только принтера с мостом COM<->USB. Для некоторых принтеров есть драйверы, но работают они, прамо таки сказать, не торт.