Du HTML dans un QTableView | Comment programmer avec Qt c++ | Blog Qt


Du HTML dans un QTableView

Posté par qt-programmer Le 3 October 2011 Ajout Commentaires

Qt ne permet pas d’inclure du HTML dans un tableau ou un liste :-(

Par contre, il est possible d’arriver à dessiner du “rich text” grâce à un delegate.

Pour ce qui est de l’implémentation d’un delegate, je vous épargne la théorie, c’est relativement facile, il n’y a qu’à voir les centaines d’exemples sur le web à ce sujet.

Cherchez ‘HTML OR “Rich text” Qt QStyledItemDelegate’ … ou quelque chose du genre pour y arriver, parce qu’effectivement, on doit hériter de QStyledItemDelegate.

Poiur ce qui est de la méthode paint() surchargée, voici un exemple fonctionnel :

void MyTableViewDelegate::paint(QPainter *a_pPainter
   , const QStyleOptionViewItem &a_Option
   , const QModelIndex &a_Index) const
{
   QVariant value = a_Index.data();
   if (value.isValid() && !value.isNull())
   {
      // On crée un document pour y écrire du HTML.
      QTextDocument _Document;
      QStyleOptionViewItemV4 _Options = a_Option;

      initStyleOption(&_Options, a_Index);

      // On enregistre le painter pour qu'il ne soit pas
      // modifié à la fin de la méthode.
      a_pPainter->save();

      QString _Text = _Options.text;

      // Pour voir la sélection, on met le texte en gras
      // si l'item est sélectionné et que la vue a le focus.
      if((a_Option.state & QStyle::State_Selected)
        && (a_Option.state & QStyle::State_HasFocus))
      {
         _Text = "<div style='color:"
            + a_Option.palette.highlightedText().color().name()
            + "; font-weight: bold;'>" + _Text + "</div>";
      }

      // On prends la peine de dessiner un document
      // seulement s'il y a du HTML.
      bool _MightBeRichText;
      if(_MightBeRichText = Qt::mightBeRichText(_Text))
         _Options.text = "";

      // S'il y a du HTML, on dessine un controle vide.
      // Sinon on garde le texte et on laisse tomber le document.

      _Options.widget->style()->drawControl(QStyle::CE_ItemViewItem
      , &_Options, a_pPainter, _Options.widget);

      if(_MightBeRichText)
      {
         // On met le HTML dans le document (pas setText)
         _Document.setHtml(_Text);

         // On centre le document dans le contrôle.
         QPoint _Point = a_Option.rect.center();

	// On bouge le texte s'il y a une icône.
         QSize _IconSize = _Options.icon.actualSize(_Options.rect.size());
         _Point.setX(a_Option.rect.left()
          + _IconSize.width()
          + (_IconSize.width() > 1 ? 4 : 0));
         // avec une petite marge (4px) pour avoir
         // la même apparence que si on dessine
         // le contrôle normalement.

         int _TextHeight = _Document.size().height();
         // On centre le texte verticalement.
         _Point.setY(_Point.y() -  (_TextHeight>>1));
         a_pPainter->translate(_Point);      

         // Finalement on dessine le texte HTML.
         _Document.drawContents(a_pPainter);
      }

      // Et on remet le painter comme il était au départ de la méthode.
      a_pPainter->restore();
   }
}

Voilà !

Ça fonctionne bien pour moi, si vous avez des commentaires, n’hésitez pas.




Laisser une réponse


Spam Protection by WP-SpamFree




Sponsors