Operaciones asíncronas
De manera predeterminada, PrintOperation::run() retorna cuando una operación de impresión ha terminado. Si necesite ejecutar una operación no modal de impresión, llame a PrintOperation::set_allow_async(). Tenga en cuenta que, a pesar de que no todas las plataformas soportan set_allow_async(), la señal done se emitirá de todos modos.
run() puede devolver PRINT_OPERATION_RESULT_IN_PROGRESS. Para rastrear el estado y manejar el resultado de un error, necesita implementar manejadores de las señales done y status_changed.
Por ejemplo,
// in class ExampleWindow's method... Glib::RefPtr<PrintOperation> op = PrintOperation::create(); // ...set up op... op->signal_done().connect(sigc::bind(sigc::mem_fun(*this, &ExampleWindow::on_printoperation_done), op)); // run the op
Segundo, comprobar si hay errores y conectar la señal status_changed. Por ejemplo:
void ExampleWindow::on_printoperation_done(Gtk::PrintOperationResult result, const Glib::RefPtr<PrintOperation>& op) { if (result == Gtk::PRINT_OPERATION_RESULT_ERROR) //notify user else if (result == Gtk::PRINT_OPERATION_RESULT_APPLY) //Update PrintSettings with the ones used in this PrintOperation if (! op->is_finished()) op->signal_status_changed().connect(sigc::bind(sigc::mem_fun(*this, &ExampleWindow::on_printoperation_status_changed), op)); }
Por último, comprobar el estado. Por ejemplo,
void ExampleWindow::on_printoperation_status_changed(const Glib::RefPtr<PrintFormOperation>& op) { if (op->is_finished()) //the print job is finished else //get the status with get_status() or get_status_string() //update UI }