2009-02-05 10 views
4

Jeu QCombobox Délégué d'article ne peignant pas pour l'article actuel ..Comment faire un délégué d'objet de peinture QCombobox pour son objet actuel? (Qt 4)

J'essaie de créer une liste déroulante montrant différents types de lignes (Solide, Pointillé, Tiret, etc.). Actuellement, je suis en train de définir le délégué de l'élément pour son contenu afin de dessiner/peindre le type de ligne au lieu d'afficher les noms. Tous les types de lignes sont dessinés correctement, mais dès que je sélectionne un type de ligne dans la liste déroulante , l'index actuel de la liste déroulante n'affiche que le nom de la ligne et ne le peint pas. Comment puis-je faire peindre le type de ligne sélectionné sur l'index combo actuel?

Répondre

0

Je pense que j'ai déjà rencontré ce problème, avec un délégué qui affiche la ligne correctement dans le menu déroulant mais pas dans la liste déroulante elle-même.

La documentation (http://doc.trolltech.com/4.4/qcombobox.html) stipule que:

« Pour le texte et l'icône dans l'étiquette combobox, les données dans le modèle qui a le Qt :: DisplayRole et Qt :: DecorationRole est utilisé. » Je pense qu'une approche qui implique un modèle qui renvoie des données appropriées pour le DecorationRole pourrait fonctionner, mais il pourrait être problématique de le faire se comporter comme vous le souhaitez.

0

Vous pouvez également enregistrer vos images dans des icônes et utiliser QComboBox :: setIconSize() pour éviter la mise à l'échelle.

-1

Remplacez simplement paintEvent. Voici un code croquis:

void PenComboBox::paintEvent(QPaintEvent* pEvent) 
{ 
    QComboBox::paintEvent(pEvent); 
    QVariant itemData = this->itemData(this->currentIndex(), Qt::DisplayRole); 
    if(!itemData.isNull() && qVariantCanConvert<QPen>(itemData)) 
    { 
    QPainter painter(this); 
    // .. etc 
    } 
} 
3

délégué à peindre des éléments combo pop-up:

class LineStyleDelegate(QtGui.QItemDelegate): 

    def __init__(self, object, parent = None): 
     QtGui.QItemDelegate.__init__(self, parent) 

    def paint(self, painter, option, index): 
     data = index.model().data(index, QtCore.Qt.UserRole) 
     if data.isValid() and data.toPyObject() is not None: 
      data = data.toPyObject() 
      painter.save() 

      rect = option.rect 
      rect.adjust(+5, 0, -5, 0) 

      pen = QtGui.QPen() 
      pen.setColor(QtCore.Qt.black) 
      pen.setWidth(3) 
      pen.setStyle(data) 
      painter.setPen(pen) 

      middle = (rect.bottom() + rect.top())/2 

      painter.drawLine(rect.left(), middle, rect.right(), middle) 
      painter.restore() 

     else: 
      QtGui.QItemDelegate.paint(self, painter, option, index) 

     painter.drawLine(rect.left(), middle, rect.right(), middle) 
     painter.restore() 

    else: 
     QtGui.QItemDelegate.paint(self, painter, option, index) 

paintEvent pour peindre élément courant combo. Vous pouvez, bien sûr, le peindre manuellement, mais il y a la manière simple de dessiner le contrôle de la combo lui-même (si vous voulez un bouton fléché ou un smth dans le courant):

def paintEvent(self, e): 
    data = self.itemData(self.currentIndex(), QtCore.Qt.UserRole) 
    if data.isValid() and data.toPyObject() is not None: 
     data = data.toPyObject() 
     p = QtGui.QStylePainter(self) 
     p.setPen(self.palette().color(QtGui.QPalette.Text)) 

     opt = QtGui.QStyleOptionComboBox() 
     self.initStyleOption(opt) 
     p.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt) 

     painter = QtGui.QPainter(self) 
     painter.save() 

     rect = p.style().subElementRect(QtGui.QStyle.SE_ComboBoxFocusRect, opt, self) 
     rect.adjust(+5, 0, -5, 0) 

     pen = QtGui.QPen() 
     pen.setColor(QtCore.Qt.black) 
     pen.setWidth(3) 
     pen.setStyle(data) 
     painter.setPen(pen) 

     middle = (rect.bottom() + rect.top())/2 

     painter.drawLine(rect.left(), middle, rect.right(), middle) 
     painter.restore() 

    else: 
     QtGui.QComboBox.paintEvent(self, e) 
Questions connexes