2017-07-11 1 views
2

J'ai trouvé que faireComment définir le texte dans le QComboBox d'aligner au centre sans modifiable dans PyQt

self.combo.setEditable(True) 
self.combo.lineEdit().setAlignment(QtCore.Qt.AlignCenter) 

alignera le texte dans la zone de liste déroulante au centre. Mais dès que je fais cela, le style que j'ai appliqué à la liste déroulante ne fonctionne pas et le texte qui s'affiche à l'intérieur sera le texte brut par défaut. Aussi, je ne veux pas le rendre modifiable et je n'aime pas l'effet de l'interface graphique qui se produit lorsque nous le définissons à éditable.

Y a-t-il un moyen facile de centrer le texte tout en conservant les mêmes effets que précédemment (comme le style et le comportement en cliquant dessus)?

+0

J'ai même essayé de mettre la combobox en lecture seule. Mais cela n'aide pas –

+0

Il n'y a aucun moyen autre que réimplement 'paintEvent()' méthode – bakatrouble

+0

il serait très utile de vous si vous fournissez un petit fragment de code pour faire quelque chose comme un texte en gras avec cette méthode ... de toute façon je se penchera sur les docs –

Répondre

2

Vous pouvez réimplémenter combobox routine de dessin par vous-même de cette façon (extrait du projet je travaille):

class CustomComboBox(QtGui.QComboBox): 
    ... 

    def paintEvent(self, evt): 
     painter = QtGui.QStylePainter(self) 
     painter.setPen(self.palette().color(QtGui.QPalette.Text)) 
     option = QtGui.QStyleOptionComboBox() 
     self.initStyleOption(option) 
     painter.drawComplexControl(QtGui.QStyle.CC_ComboBox, option) 
     textRect = QtGui.qApp.style().subControlRect(QtGui.QStyle.CC_ComboBox, option, QtGui.QStyle.SC_ComboBoxEditField, self) 
     painter.drawItemText(
      textRect.adjusted(*((2, 2, -1, 0) if self.isShown else (1, 0, -1, 0))), 
      QtGui.qApp.style().visualAlignment(self.layoutDirection(), QtCore.Qt.AlignLeft), 
      self.palette(), self.isEnabled(), 
      self.fontMetrics().elidedText(self.currentText(), QtCore.Qt.ElideRight, textRect.width()) 
     ) 

    ... 

painter.drawItemText appel où le texte est en cours d'élaboration.