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 :

QPlainTextEdit et QTextBlock::setVisibility(bool b))


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Par défaut QPlainTextEdit et QTextBlock::setVisibility(bool b))
    Bonsoir,

    Voilà j'ai un petit problème avec un QPlainTextEdit dont le QTextDocument contient des QTextBlock cachés.
    J'ai plusieurs lignes successives cachées grâce à QTextBlock::setVisibility(bool b).
    Il arrive que le scroll vertical ne fonctionne pas correctement, on dirait que QAbstractScrollArea ne tient pas compte des lignes cachées.

    J'ai trouvé une ou deux références à ce problème sur des forums malheureusement sans solutions.

    Quelqu'un aurait une idée pour éviter ce problème ?

    Merci

  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
    Par défaut
    Bonsoir,

    Après une petite recherche sur Google, je suis tombé sur le rapport de bug http://bugreports.qt.nokia.com/browse/QTBUG-9573 qui traite le problème d'un crash avec QTextBlock::setVisible(false), mais ce n'est apparemment pas le problème.

    À première vue,

    Il arrive que le scroll vertical ne fonctionne pas correctement, on dirait que QAbstractScrollArea ne tient pas compte des lignes cachées.
    indique qu'il s'agirait probablement d'un problème de peinture. Avez-vous tenté d'utiliser la fonction update() après avoir affiché votre QTextBlock ?

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Par défaut
    Oui j'utilise update de ma sous classe de QPlainTextEdit et du viewport.
    Et oui, il s'agit d'un problème de peinture puisque j'observe une copie de la première ligne après les blocs cachés sur la ligne suivante si je réalise un scroll avant arrière.

    J'arrive à reproduire le bug mais c'est difficile à décrire.
    Je peux éventuellement mettre le code mais c'est un peu long...

  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
    Par défaut
    Qt Creator semble avoir recourt à la fonction setVisible() de QTextBlock. Voici un commit où ils le problème semble être traité :

    http://qt.gitorious.org/+qtuitest/qt...8023963c2c9920

    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
    50
    51
    void BaseTextEditor::drawCollapsedBlockPopup(QPainter &painter,
                                                 const QTextBlock &block,
                                                 QPointF offset,
                                                 const QRect &clip)
    {
        int margin = block.document()->documentMargin();
        qreal maxWidth = 0;
        qreal blockHeight = 0;
        QTextBlock b = block;
     
        while (!b.isVisible()) {
            b.setVisible(true); // make sure block bounding rect works
            QRectF r = blockBoundingRect(b).translated(offset);
     
            QTextLayout *layout = b.layout();
            for (int i = layout->lineCount()-1; i >= 0; --i)
                maxWidth = qMax(maxWidth, layout->lineAt(i).naturalTextWidth() + 2*margin);
     
            blockHeight += r.height();
     
            b.setVisible(false); // restore previous state
            b.setLineCount(0); // restore 0 line count for invisible block
            b = b.next();
        }
     
        painter.save();
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.translate(.5, .5);
        QBrush brush = palette().base();
        if (d->m_ifdefedOutFormat.hasProperty(QTextFormat::BackgroundBrush))
            brush = d->m_ifdefedOutFormat.background();
        painter.setBrush(brush);
        painter.drawRoundedRect(QRectF(offset.x(),
            offset.y(),
            maxWidth, blockHeight).adjusted(0, 0, 0, 0), 3, 3);
        painter.restore();
     
        QTextBlock end = b;
        b = block;
        while (b != end) {
            b.setVisible(true); // make sure block bounding rect works
            QRectF r = blockBoundingRect(b).translated(offset);
            QTextLayout *layout = b.layout();
            QVector<QTextLayout::FormatRange> selections;
            layout->draw(&painter, offset, selections, clip);
     
            b.setVisible(false); // restore previous state
            offset.ry() += r.height();
            b = b.next();
        }
    }
    Le plus intéressant dans ce code, c'est sans doute l'utilisation de QTextLayout qui semble être une piste intéressante.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Par défaut
    Euh, je pense qu'il s'agit du popup qui affiche le texte replié.
    Pas de rapport avec le scrolling ni avec la méthode utilisée pour réaliser le repli.

    Mais merci quand même...

  6. #6
    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
    Par défaut
    En effet, j'étais complètement à côté de la plaque. J'ai réussi à reproduire le problème, et également à le corriger avec l'appel de repaint() sur le viewport() :

    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
    #include <QtGui>
     
    class MyClass : public QWidget
    {
        Q_OBJECT
    public:
        MyClass() {
            _textEdit = new QPlainTextEdit;
            QPushButton *_button = new QPushButton("Hide/Show first block");
            setLayout(new QVBoxLayout);
            layout()->addWidget(_button);
            layout()->addWidget(_textEdit);
            connect(_button, SIGNAL(clicked()), this, SLOT(hideOrShow()));
        }
    private:
        QPlainTextEdit *_textEdit;
    private slots:
        void hideOrShow() {
            QTextBlock _hiddenBlock = _textEdit->document()->firstBlock();
            if (!_hiddenBlock.isValid()) {
                QMessageBox::warning(this, "Error", "Invalid text block. Passed.");
                return;
            }
            _hiddenBlock.setVisible(!_hiddenBlock.isVisible());
            _textEdit->viewport()->repaint();
        }
     
    };
     
    #include "main.moc"
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        QMainWindow w;
        w.setCentralWidget(new MyClass);
        w.show();
     
        return a.exec();
    }
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

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

Discussions similaires

  1. Quelle est la différence entre bool et BOOL
    Par irnbru dans le forum MFC
    Réponses: 2
    Dernier message: 03/11/2005, 15h35
  2. BOOL et BOOLEAN
    Par dus dans le forum MFC
    Réponses: 3
    Dernier message: 17/10/2005, 19h16
  3. Réponses: 8
    Dernier message: 01/03/2005, 22h41
  4. Boole decrementeur
    Par bolo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 20/12/2004, 17h09
  5. vector<bool> comme argument de fonction
    Par Krishna dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/09/2004, 08h30

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