Opérations asynchrones
Par défaut, PrintOperation::run() rend la main quand l'opération d'impression est terminée. Si vous voulez lancer une opération d'impression non-bloquante, appelez PrintOperation::set_allow_async(). Notez que set_allow_async() n'est pas pris en charge sur toutes les plates-formes, bien que le signal done soit toujours émis.
Il se peut que la fonction membre run() renvoie PRINT_OPERATION_RESULT_IN_PROGRESS. Pour suivre l'état et gérer le résultat ou une erreur, vous devez implémenter des gestionnaires pour les signaux done et status_changed :
Par exemple,
// dans la fonction membre de la classe ExampleWindow...
Glib::RefPtr<PrintOperation> op = PrintOperation::create();
// ...paramétrer op...
op->signal_done().connect(sigc::bind(sigc::mem_fun(*this,
&ExampleWindow::on_printoperation_done), op));
// lancer op
Ensuite, vérifiez si une erreur est survenue et connectez le signal status_changed. Par exemple :
void ExampleWindow::on_printoperation_done(Gtk::PrintOperationResult result,
const Glib::RefPtr<PrintOperation>& op)
{
if (result == Gtk::PRINT_OPERATION_RESULT_ERROR)
// avertir l'utilisateur
else if (result == Gtk::PRINT_OPERATION_RESULT_APPLY)
// mettre à jour PrintSettings avec ceux de cette PrintOperation
if (! op->is_finished())
op->signal_status_changed().connect(sigc::bind(sigc::mem_fun(*this,
&ExampleWindow::on_printoperation_status_changed), op));
}
Pour terminer, vérifiez l'état. Par exemple :
void ExampleWindow::on_printoperation_status_changed(
const Glib::RefPtr<PrintFormOperation>& op)
{
if (op->is_finished())
// la tâche d'impression est terminée
else
// obtenir l'état avec get_status() ou get_status_string()
// mettre à jour l'UI
}