Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Работа с периферийными устройствами через API в Linux  (Прочитано 3478 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Mixim

  • Автор темы
  • Участник
  • *
  • Сообщений: 114
    • Просмотр профиля
Разрабатываю в Qt на C++ под Linux программу, которая должна с помощью API работать с принтером(LPT-порт) и другими устройствами. Т.к. практики по работе напрямую с API никогда не имел(ни под "Окошком", ни под Linux), хотелось бы поинтересоваться у Вас: в какую сторону копать, где можно почитать/посмотреть каким образом это делается и уж совсем наглость: ни могли бы Вы немного объяснить на пальцах как это работает в Linux, каким образом можно вызвать API-функцию?
« Последнее редактирование: 02 Августа 2012, 05:24:40 от Mixim »

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Работа с API в Linux
« Ответ #1 : 01 Августа 2012, 15:40:51 »
Если вам надо организовать печать документов или чего-то другого в своей программе и вы используя Qt будете использовать платформазависимое API то возникает вопрос на кой вам Qt тогда? если это не специфическая задача используйте соответствующие классы Qt для печати.....
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Mixim

  • Автор темы
  • Участник
  • *
  • Сообщений: 114
    • Просмотр профиля
Re: Работа с API в Linux
« Ответ #2 : 01 Августа 2012, 15:54:20 »
Спасибо, буду смотреть
Если вам надо организовать печать документов или чего-то другого в своей программе и вы используя Qt будете использовать платформазависимое API то возникает вопрос на кой вам Qt тогда? если это не специфическая задача используйте соответствующие классы Qt для печати.....
Немного отойду от темы, но все же... А можно узнать Qt класс, который способен выводить на данные печать? Да, принтер не для обычной стационарной машины, а для терминала

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Работа с API в Linux
« Ответ #3 : 01 Августа 2012, 16:12:24 »
но попробовать стоит сначала все же классы Qt: Печать с Qt
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Mixim

  • Автор темы
  • Участник
  • *
  • Сообщений: 114
    • Просмотр профиля
Тему немного переименовал
но попробовать стоит сначала все же классы Qt: Печать с Qt
Спасибо большое! Получился следующий тестовый код:
//инициализируем класс QPrinter, который будет выводить данные на печать
    QPrinter printer(QPrinter::HighResolution);
//устанавливаем отступы и единицы измерения
        printer.setPageMargins(10,10,10,10, QPrinter::Millimeter);
        //printer.setPaperSize(printer.B9);

//инициализируем QPrintDialog
    QPrintDialog *dlg = new QPrintDialog(&printer, this);
//если в textEdit что-то выделено
        if (ui->textEdit->textCursor().hasSelection())
        {
//устанавливаем печать выделения
            dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection);
        }
//устанавливаем заголовок dlg
        dlg->setWindowTitle(tr("Print Document"));
//если пользователь подтвердил желание печати
        if (dlg->exec() == QDialog::Accepted)
        {
//печатаем текст с помощью созданного ранее объекта printer
            ui->textEdit->print(&printer);
        }
//удаляем dlg
        delete dlg;

Он отлично работает, но сами понимаете, что в моем случае выводить клиенту диалоговое окно с предложением выбрать принтер, формат бумаги и т.д. - это по меньшей мере странно(терминал), поэтому необходимо сделать что-то в этом роде, но без использования QPrintDialog. Например, необходимо распечатать чек - программа обращается к ОС, опрашивает устройства ввода-вывода и находит принтер=>данные уходят на этот самый принтер(не самый хороший вариант, т.к. ситуации бывают разные и помимо физического принтера, может быть установлен виртуальный - клиент чека не получит) или еще вариант: администратор терминала устанавливает в ручную устройство, которое будет печатать данные(каким образом можно получить имена доступных принтеров), а программа задействует выбранное устройство. Как такое можно сделать?
Немного подумав над указанными методиками вывода текста без отображения QPrintDialog и посмотрев методы, доступные в классе QPrinter, пишу следующий код:
    QPrinter printer(QPrinter::HighResolution);
        printer.setPageMargins(10,10,10,10, QPrinter::Millimeter);
        printer.setPaperSize(printer.B9);

//смотрю имя принтера, которое было получено при инициализации переменной printer
ui->textEdit->append(printer.printerName()+"\n");
В textEdit получаю: "XEROX_Phaser_3100MFP", т.е. стандартный принтер(точнее МФУ), подключенный к моей машине - хорошо, может быть получится просто отправить данные на указанное МФУ без QPrintDialog, дополняю указанный код:
    QPrinter printer(QPrinter::HighResolution);
        printer.setPageMargins(10,10,10,10, QPrinter::Millimeter);
        printer.setPaperSize(printer.B9);

//смотрю имя принтера, которое было получено при инициализации переменной printer
ui->textEdit->append(printer.printerName()+"\n");
ui->textEdit->print(&printer)
Задание на печать появляется, но оно имеет состояние "Запланировано" - ничего не выводится. Подскажите пожалуйста, что делаю не так, а также каким образом можно получить имена всех имеющихся в системе принтеров?


Пользователь решил продолжить мысль 02 Августа 2012, 06:08:43:
Почитал немного ЗДЕСЬ и получил следующие строчки, которые возвращают все доступные принтера в системе, но понять почему задание на печать добавляется сос статусом "Запланировано" так и не смог:
//получить доступные принтера(в список)
    QList<QPrinterInfo> printerInfo= QPrinterInfo::availablePrinters ();
//эти две строки писал для проверки, каждая из них вывела мой указанный ранее принтер(МФУ) Xerox Phaser
    ui->textEdit->setText( printerInfo.first().printerName());
    ui->textEdit->append( printerInfo.last().printerName());
Пошел дальше копаться и разбираться
« Последнее редактирование: 02 Августа 2012, 06:12:40 от Mixim »

 

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