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

  1. #1
    Inactif  
    QQ n°12 : Optimisation avec QPixmapCache
    Bonjour à tous

    Voici une nouvelle traduction d'un article de Qt Quarterly décrivant une méthode de mise en cache des pixmaps pour optimiser l'affichage des widgets. La méthode est illustré à travers 2 exemples de widgets personnalisés dont le code source est fournis.

    http://qt-quarterly.developpez.com/q.../qpixmapcache/


    Pour rappel, les Qt Quarterly sont des articles techniques écris par des spécialistes de Qt. Plusieurs articles ont été traduit en français par l'équipe de rédaction Qt de developpez.com. Retrouvez les traductions à http://qt-quarterly.developpez.com/.

    N'hésitez pas à commenter cet article et à partager votre propre expérience concernant des approches similaires d'optimisation.

    Bonne lecture.

  2. #2
    Invité
    Invité(e)
    Superbe traduction ! Bravo gbdivers !

    Bon quand même un peu vieux... Certaine classe ont disparute depuis le temps... Je pense par exemple à QPointArray, ou encore à QGrid (dans le code source téléchargeable)...

    J'ai quand même une question, dans les codes suivants :

    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
     
    void Lights::paintEvent(QPaintEvent *)
    {
        QString key = QString("lights:%1:%2")
                              .arg(m_color.name())
                              .arg(m_diameter);
        QPixmap pixmap;
     
        if (!QPixmapCache::find(key, pixmap)) {
            pixmap = generatePixmap();
            QPixmapCache::insert(key, pixmap);
        }
        bitBlt(this, 0, 0, &pixmap);
    }
    // Et
    void Graph::paintEvent(QPaintEvent *)
    {
        if (m_width <= 0 || m_height <= 0)
            return;
     
        QPixmap pixmap;
     
        if (!QPixmapCache::find(key(), pixmap)) {
            pixmap = generatePixmap();
            QPixmapCache::insert(key(), pixmap);
        }
        bitBlt(this, 0, 0, &pixmap);
    }

    A quoi correspond la fonction bitBlt ? je ne la trouve ni dans l'en-tête QtGlobal, ni dans QWidget...

    Un dernière question :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    QString Graph::key() const
    {
        QString result;
        result.sprintf("%p", static_cast<const void *>(this));
        return result;
    }

    La fonction sprintf... Elle sert à quoi ? Je ne la trouve pas dans la doc...

    A part ça, je trouve que tu aurais au moins dû signaler la version de Qt... Merci quand même, bonne continuation à toi.

  3. #3
    Inactif  
    Bonjour Abdelite et merci pour tes remarques.

    Cette traduction (l'une de mes premières) décrit une technique très utile. Voilà pourquoi je l'ai écrite, malgré son ancienneté. Même si le code doit être modifié, le principe reste d'actualité.

    L'article original date de 2004 et donc il faut regarder la doc de Qt 3 :
    - pour sprintf : http://qt.developpez.com/doc/3.3/qst...g.html#sprintf (cette fonction permet de mettre en forme du texte)
    - pour bitBlt : http://qt.developpez.com/doc/3.3/qpa...ce.html#bitBlt (réalise une copie pixel par pixel d'un QPixmap vers un QPixmap).
    Tu peux utiliser le code suivant à la place :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    QPainter painter(this);
    painter.drawPixmap(0,0, pixmap);


    Cela fait partie des mes projets de reprendre les traductions de Qt Quarterly et de vérifier les informations et le code fournit pour mettre à jour (après les traductions de QQ33 et des "Qt Graphics and performances")

  4. #4
    Invité
    Invité(e)
    Merci pour la réponse gbdivers, bonne continuation, et à bientôt pour de nouvelle traductions.

  5. #5
    Invité
    Invité(e)
    Un autre petite erreur : painter.setBrush(darkGray); => painter.setBrush(Qt::darkGray);.

  6. #6
    Inactif  
    Ça, ce n'est pas une erreur. Le code original (Qt3) n'utilise pas Qt::

    Pour le moment, le code sources des Qt Quarterly n'est mis à jour en fonction de la version de Qt

  7. #7
    Invité
    Invité(e)
    Ah ok... Je ne savais pas. Merci quand même du renseignement...