Как получить сигнал в Qt от принтера, когда он заканчивает печать? - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь получать уведомления в Qt для принтера, но, к сожалению, не могу найти никакого решения. Я уже пытался проверить состояние, но оно никогда не меняется, это всегда «PrinterState :: Idle».

void Functions::print(QString fileName)
{
    printerTmr = new QTimer(this); 
    printerTmr->setInterval(2000); 
    connect(printerTmr, SIGNAL(timeout()), this, SLOT(printerStateCheck())); 
    printerTmr->start(); //start checking the state of the printer

    printer.setPageSize(QPrinter::A6);
    printer.setOrientation(QPrinter::Landscape);
    QImage img(fileName);

    QSize size;
    QIcon icon;

    QPainter painter( &printer );
    int      w = printer.pageRect().width();
    int      h = printer.pageRect().height();
    QRect    page( 0, 0, w, h );

    QImage image(fileName);
    if (!image.isNull())
      icon.addPixmap(QPixmap::fromImage(image), QIcon::Normal, QIcon::On);

    icon = icon;
    size = QSize(w,h);
    QPixmap pixmap = icon.pixmap(size, QIcon::Normal, QIcon::On);
    ........

    //draw simulated landscape
    page.adjust( w/20, h/20, -w/20, -h/20 );
    painter.drawPixmap(QPoint(0,0),pixmap);

}

void Functions::printerStateCheck()
{

    if(printer.printerState() == QPrinter::PrinterState::Idle){
        qDebug()<<"PrinterState::Idle";
    }else if(printer.printerState() == QPrinter::PrinterState::Error){
        qDebug()<<"PrinterState::Error";
    }else if(printer.printerState() == QPrinter::PrinterState::Active){
        qDebug()<<"PrinterState::Active";
    }else if(printer.printerState() == QPrinter::PrinterState::Aborted){
        qDebug()<<"PrinterState::Aborted";
    }
}

1 Ответ

2 голосов
/ 21 июня 2019

Возможность печати в Qt очень проста.Устройство QPrinter представляет собой серию страниц печатного вывода и используется почти точно так же, как и другие устройства рисования, такие как QWidget и QPixmap .

При печати непосредственно на принтер в Windows или macOS, QPrinter использует встроенные драйверы принтера.На X11 QPrinter использует Common Unix Printing System (CUPS) для отправки вывода PDF на принтер.

В качестве альтернативы, функция printProgram () может использоваться для указания команды или утилиты, которые будут использоваться вместо системных по умолчанию.(PS: но только в системе X11 для печати PDF)

QPrinter :: printerState () Возвращает текущее состояние принтера.Это может не всегда быть точным (например, если принтер не имеет возможности сообщать о своем состоянии операционной системе).

Так, как в документе Qt говорится, что он находится на принтере, драйверах принтера, подсистеме печати и самой ОС для предоставления состояния.Я думаю, вам больше повезло с печатью состояний в Linux с CUPS, чем в Windows.

Попробуйте использовать API печати ОС напрямую.

Ниже приведена информация с примером кода для WINAPI на Как получить состояние принтера и задание на печать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...