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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: очередь печати и как с ней быть..:-)  (Прочитано 11890 раз)
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... чтобы не случилось

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

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

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

КАК БЫТЬ И ЧТО Я ДЕЛАЮ НЕ ТАК..??
Записан
Denjs
Гость
« Ответ #1 : Сентябрь 15, 2010, 11:46 »

Имхо - первое что вы делаете не так - это работаете с принтером через виндоус драйвера. А остальное - следствие этой ошибки.

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

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

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

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

__________________
если же хотите ковыряться с очередью печати - то думаю тут вам только доблестное изучение WinAPI поможет.
« Последнее редактирование: Сентябрь 15, 2010, 11:52 от Denjs » Записан
zoro86
Гость
« Ответ #2 : Сентябрь 15, 2010, 12:09 »

дело в том что мне пока для Windows надо...
И комплектация терминалов тоже разная... некоторые приходят с COM-кабелями а некоторые с USB поэтому стоит задача чтобы работать можно было с любыми...

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

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

вот по поводу WinApi можете сылочку дать... или идейку еще какую нить..
Записан
Denjs
Гость
« Ответ #3 : Сентябрь 15, 2010, 13:40 »

И комплектация терминалов тоже разная... некоторые приходят с COM-кабелями а некоторые с USB поэтому стоит задача чтобы работать можно было с любыми...
USB-шные принтеры все ранво реализуют профиль последовательного устройства который подхватывается драйвером виртуального ком-порта для виндоус (если принтер нормальный конечно... что могут придумать china-производители я боюсь представить). В рамках данного виртуального компорта обмен не должен отличаться от обмена с устройством которое подключено на физический последовательный порт.

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

В случае отказа от вынь дравера - вам также придется менять технологии подготовки изображения.
Никаких QPrinter и т.п. : вы руками готовите последовательность команд(при прямой работе с портом), или готовите html-строку с текстом (в случае моего драйвера OTPD) или руками вызываете API-функции библиотеки-драйвера (в случае АТОЛ: Драйвер принтеров чеков)

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

С WinAPI я вам помочь не смогу.
« Последнее редактирование: Сентябрь 15, 2010, 13:55 от Denjs » Записан
zoro86
Гость
« Ответ #4 : Сентябрь 16, 2010, 06:17 »

Понятно спс большущее... буду копать...

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

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

лично я писал с нуля... использовал библиотеку qserialdevice которую любезно предоставил и направил на истенный путь   kuzulis...
Записан
Denjs
Гость
« Ответ #5 : Сентябрь 16, 2010, 11:24 »

гм... так я не понял. вы сейчас с помощью QPrinter напечать отправляете через виндовые драйвера, или руками через qserialdevice  ?

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

за ссылку спасибо. посмотрим на досуге.
Записан
zoro86
Гость
« Ответ #6 : Сентябрь 17, 2010, 13:43 »

Тут такое дела что привозят терминалы как с принтерами подключенные через СОМ-порт так и с принтерами подключенными через USB.
С принтерами которые идут через СОМ я разобрался ... накатал для каждого отдельный класс и так далее... сделал определялку... в зависимости от найденного принтера подгружает соответствующий класс для работы с данным принтером...

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

вот бы эти очереди очищать научится.. как надо будет... Подмигивающий
Записан
Denjs
Гость
« Ответ #7 : Сентябрь 17, 2010, 16:42 »

С принтерами которые идут через СОМ я разобрался ... накатал для каждого отдельный класс и так далее... сделал определялку...
Осталось разобраться с теми принтерами которые приходят подключенными через USB...
Попробуйте поставить драйвер-виртуального ком-порта для ваших принтеров. Оно должно быть на сайте производителя или у поставщика где-нибудь в разделе драйверов.
Ещё подобное должно поставляться в составе атоловских драйверов принтеров чеков.
Потом на него натаскивайте ваши классы.
« Последнее редактирование: Сентябрь 17, 2010, 16:59 от Denjs » Записан
maxxant
Гость
« Ответ #8 : Сентябрь 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) и, видимо, предназначено для собственных реализаций подобных функций. У нас состояние принтера и управление очередью печати реализуется через свои платформо-зависимые костыли.
Записан
Magvaj
Гость
« Ответ #9 : Сентябрь 29, 2010, 11:12 »

Попробуйте поставить драйвер-виртуального ком-порта для ваших принтеров. Оно должно быть на сайте производителя или у поставщика где-нибудь в разделе драйверов.
Ещё подобное должно поставляться в составе атоловских драйверов принтеров чеков.
Потом на него натаскивайте ваши классы.

Для принтеров Custom VKP, StarTUP и Zebra драйверов виртуального порта нет. И сесли интерфейс COM отсутствует- только через QPrinter и стандартные дрова.
Записан
Denjs
Гость
« Ответ #10 : Сентябрь 29, 2010, 12:49 »

Для принтеров Custom VKP, StarTUP и Zebra драйверов виртуального порта нет. И сесли интерфейс COM отсутствует- только через QPrinter и стандартные дрова.
... гы... просто интересно - а если их в линуксу подключить  - стандартный драйвер ком-профиля usb-порта узнает их? кабельки там разные узнает на ура)
Записан
Magvaj
Гость
« Ответ #11 : Сентябрь 30, 2010, 07:45 »

гы... просто интересно - а если их в линуксу подключить  - стандартный драйвер ком-профиля usb-порта узнает их? кабельки там разные узнает на ура)

для линухи пользуюсь стандартными COM или LPT. Если принтер USB, то работают только принтера с мостом COM<->USB. Для некоторых принтеров есть драйверы, но работают они, прамо таки сказать, не торт.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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