2017-10-08 6 views
2

J'ai créé un objet QTextEdit. Le code ci-dessous ajoute des rehauts colorés au texte actuellement sélectionné. J'ai besoin que les hautes lumières soient semi-transparentes pour que je puisse voir les hautes lumières superposées les unes aux autres. Utiliser "setAlpha" ne semble rien faire. Comment puis-je définir l'alpha pour la surbrillance ou sinon obtenir semi-transparence?Surlignages semi-transparents avec PySide et QTextEdit

# Define cursor & span  
self.cursor = self.textdoc.textCursor() 
self.selstart = self.cursor.selectionStart() 
self.selend = self.cursor.selectionEnd() 
self.seltext = self.cursor.selectedText() 

# Create random color 
r = randint(0,255) 
g = randint(0, 255) 
b = randint(0, 255) 
color = QColor(r,g,b) 
color.setAlpha(125) 
format = QTextCharFormat() 
format.setBackground(color) 
self.cursor.setCharFormat(format) 

Répondre

2

Il semble peu probable que QTextEdit soutiendrait tout aussi sophistiqué que le formatage en couches. Donc je pense que vous devrez faire le mélange des couleurs vous-même. L'exemple ci-dessous utilise une méthode assez grossière, mais cela semble fonctionner. Je ne sais pas exactement ce que les résultats que vous visez, mais il devrait vous donner une idée comment proceeed:

import sys 
from random import sample 
from PySide import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.button = QtGui.QPushButton('Highlight', self) 
     self.button.clicked.connect(self.handleButton) 
     self.edit = QtGui.QTextEdit(self) 
     self.edit.setText(open(__file__).read()) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.edit) 
     layout.addWidget(self.button) 

    def blendColors(self, first, second, ratio=0.5, alpha=100): 
     ratio2 = 1 - ratio 
     return QtGui.QColor(
      (first.red() * ratio) + (second.red() * ratio2), 
      (first.green() * ratio) + (second.green() * ratio2), 
      (first.blue() * ratio) + (second.blue() * ratio2), 
      alpha, 
      ) 

    def handleButton(self): 
     cursor = self.edit.textCursor() 
     start = cursor.selectionStart() 
     end = cursor.selectionEnd() 
     if start != end: 
      default = QtGui.QTextCharFormat().background().color() 
      color = QtGui.QColor(*sample(range(0, 255), 3)) 
      color.setAlpha(100) 
      for pos in range(start, end): 
       cursor.setPosition(pos) 
       cursor.movePosition(QtGui.QTextCursor.NextCharacter, 
            QtGui.QTextCursor.KeepAnchor) 
       charfmt = cursor.charFormat() 
       current = charfmt.background().color() 
       if current != default: 
        charfmt.setBackground(self.blendColors(current, color)) 
       else: 
        charfmt.setBackground(color) 
       cursor.setCharFormat(charfmt) 
      cursor.clearSelection() 
      self.edit.setTextCursor(cursor) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(800, 100, 600, 500) 
    window.show() 
    sys.exit(app.exec_()) 

(PS: une chose que je ne l'ai pas essayé de mettre en œuvre ici est enlever Faits saillants Si vous avez utilisé un jeu de couleurs relativement petit, je suppose que vous pouvez pré-calculer une table de toutes les combinaisons de couleurs, puis utiliser une clé de (current_color, removed_color) pour rechercher la couleur "soustraite" requise.

+0

merci. Votre code résout le problème d'affichage. Je suis inquiet de la complexité de l'ajout et de la suppression des faits saillants. Alpha dans le textEdit implique une sorte de superposition, correct? Que peut-on stratifier? Existe-t-il un widget Qt en plus de textEdit qui pourrait fournir la superposition de points forts spécifiquement? – davideps

+0

Une table de consultation est à peu près aussi simple et efficace que possible. Il n'y a pas de superposition il n'y a que la peinture de fond. Je suppose que le framework graphique offre plus de possibilités, mais il semble que ce soit une solution lourde pour quelque chose d'aussi basique. – ekhumoro

+0

J'ai continué à essayer de faire fonctionner alpha. Dans la fenêtre QTextEdit, setAlpha semble fonctionner plus comme un paramètre de saturation que la vraie transparence. Votre réponse semble être le seul spectacle en ville. Je vous remercie. – davideps