IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[QWebPage] Le signal loadFinished renvoie toujours false


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 21
    Points
    21
    Par défaut [QWebPage] Le signal loadFinished renvoie toujours false
    Bonjour à tous,

    je suis débutant en Qt et je cherche à faire un petit programme pour exporté une page html en pdf.

    Donc l'idée c'est d'utiliser QWebPage pour interpréter une page html et ensuite de l'exporté en PDF avec QPrinter. J'ai deux classes : webview qui s'occupe des donnés relative à QWebPage et Print qui s'occupe des données de QPrinter.

    Dans le main j'ai liée le signale loadFinished au slot PrintPDF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Print *pdf = new Print(args);
    webview *nav = new webview();
    nav->setPrinter(pdf->getPrinter());
     
    if(nav->load(args) == false) {
        qDebug() << "can't load page";
        return 0;
    }
    //when the page page is ready, we will print it
    QObject::connect(nav->getFrame(), SIGNAL(loadFinished(bool)), nav, SLOT(printPDF(bool)));

    et donc voici ma classe webview.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include "webview.h"
    webview::webview()
    {
        page = new QWebPage;
        printer = 0;
    }
     
    webview::~webview()
    {
        delete page;
    }
     
    bool webview::load(Arguments *args)
    {
        QRegularExpression url("^(file|http)://");
        QRegularExpression fullPath("^/");
     
        QRegularExpressionMatch pathMatch = fullPath.match(args->getSource());
        QRegularExpressionMatch urlMatch = url.match(args->getSource());
     
        // see http://qt-project.org/doc/qt-4.8/qwebsettings.html#WebAttribute-enum for more informations
        page->settings()->setAttribute(QWebSettings::LocalStorageEnabled, true);
        page->settings()->setAttribute(QWebSettings::AutoLoadImages, true);
        page->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
        page->settings()->setAttribute(QWebSettings::PrintElementBackgrounds, true);
        page->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
     
        if(pathMatch.hasMatch()) {
            page->mainFrame()->load(QUrl::fromLocalFile(args->getSource()));
        } else {
            if (urlMatch.hasMatch()) {
                page->mainFrame()->load(QUrl(args->getSource()));
            } else {
                fprintf(stderr, "%s\n", qPrintable(QApplication::translate("main", "Error: Invalide source file")));
                return false;
            }
        }
        return true;
    }
     
    void webview::printPDF(bool ok)
    {
        if(ok == true) {
            qDebug() << "okay";
        } else
            qDebug() << "non okay";
        if(printer != 0)
            page->mainFrame()->print(printer);
    }

    et donc voici ce que j'ai en console :

    non okay
    QPainter::begin: A paint device can only be painted by one painter at a time.
    Donc j'ai remarquer que dans la méthode printPDF si je créer une variable local ça supprime le message : "QPainter::begin: A paint device can only be painted by one painter at a time", c'est étrange parce que je passe le pointeur de QPrinter (donc ça devrais pointé sur la même classe ...) mais de toute façon ça imprime une page blanche (en gros j'ai vraiment l'impréssion que le problème viens du chargement de la page

    J'ai vraiment aucune idée d'où l'erreur peux venir. Je vous donne les sources : http://paf.im/9zSsL

    Les arguments à passer sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./htmltopdf http://www.developpez.net dossierDestination
    (dossierDestination ne fonctionne pas encore, il faut aller le modifier directement dans le code source)

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    En regardant votre main.cpp, je vois déjà certains points qui font que votre application va être instable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Print *pdf = new Print(args);
    webview *nav = new webview();
    nav->setPrinter(pdf->getPrinter());
     
    if(nav->load(args) == false) {
    	qDebug() << "can't load page";
    	return 0;
    }
     
    //when the page page is ready, we will print it
    QObject::connect(nav->getFrame(), SIGNAL(loadFinished(bool)), nav, SLOT(printPDF(bool)));
     
    // ...
     
    delete args;
    delete pdf;
    delete nav;
     
    return app.exec();
    Il faut que vous sachiez que app.exec() est une sorte de boucle infinie qui gère les événements Qt et du système et qui permet ainsi que le programme ne se ferme pas. Si vous procédez aux delete avant l'appel à cette fonction, alors vous aurez des pointeurs fraichement désalloués qui vont être utilisés, ce qui résultera probablement à un crash (ou au genre de cas indéfini lié à la variable locale dont vous parlez). Que se passe-t-il avec ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // ...
     
    bool result = app.exec();
     
    delete args;
    delete pdf;
    delete nav;
     
    return result;
    Bonne journée,
    Louis

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Vous avez raison c'est exactement ça le soucis !

    ça fais depuis ce matin que je suis sûr le problème, je commençais à désespérer ! MERCI INFINIMENT !

    Par contre, du coup j'aimerais faire en sorte qu'une fois que l'impression des pdf est été effectué que le programme se quite (execute tout les deletes).
    Avez-vous une idée de la bonne façon de faire cela ?

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Quand vous avez ce genre de problème (des comportements bizarres avec des comportements qui tombent en marche quand on ajoute une variable, ce genre de chose), c'est que vraisemblablement, une variable n'a pas été initialisée, un pointeur invalide est utilisé, quelque chose de la sorte. De mémoire, la méthode print() est synchrone (contrairement à load() de QWebFrame qui nécessite un connect() vu que ça passe par l'eventloop de Qt), ce qui fait qu'une fois que vous avez appelé cette méthode, vous pouvez fermer votre application. Cela peut se faire via QCoreApplication::quit() après votre appel à print(), ce qui mènera le app.exec() à prendre fin, à passer dans les delete et à fermer votre application avec le return result.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. AIR Diadraw isMailComposerAvailable renvoie toujours false
    Par VulpesZerda dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 31/10/2014, 12h55
  2. Regex qui renvoie toujours false
    Par renaud26 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/09/2011, 12h19
  3. If qui renvoie toujours false
    Par einsteineuzzz dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2010, 18h17
  4. FileExists renvoie toujours False
    Par aldapal dans le forum VBScript
    Réponses: 3
    Dernier message: 28/03/2008, 22h50
  5. Réponses: 2
    Dernier message: 16/04/2005, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo