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

PyQt Python Discussion :

Styler un QItemDelegate (QProgressBar) [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut Styler un QItemDelegate (QProgressBar)
    Bonjour à tous,

    j'ai une QTableView dans laquelle il y a des progressBar (en delegateItem) dans la 3ème colone.
    ma question serra simple: je souhaite changer la couleur de cette progress bar selon son statut, mais je ne trouve pas comment faire.

    j'ai déjà réussis sur une progressBar classique en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QApplication.setStyleSheet("QProgressBar:chunk {background-color: #0088dd;}")
    mais sur des delegateItem je ne sais pas comment ça marche.

    Voici mon morceaux de code (adapté pour qu'il fonctionne en standalone):

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    # Inclusions
    # Native
    import sys
     
    # Pyqt4
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
     
     
     
    #############################################################################
    class mainWidget(QWidget):
     
    	#========================================================================
    	def __init__(self, parent=None):
    		super(mainWidget,self).__init__(parent)
    		self.setGeometry(150, 150, 880, 200)
    		self.setMinimumSize(880, 200)
     
    		self.setStyleSheet(
    			 "QProgressBar {color:black; text-align:center; font-weight:bold; padding:2px;}"
    			 "QProgressBar:chunk {background-color: #0088dd; width: 10px; margin-left:1px;}"
    		)
     
     
    		########################
    		#  Var Initialisation  #
    		########################
     
    		self.parent 			= parent
    		self.fileList 			= [
    			["Valeur 1", "Commentaire 1", "", 33],
    			["Valeur 2", "Commentaire 2", "", 66],
    			["Valeur 3", "Commentaire 3", "", 100]
    		]
    		self.tmheader 			= ['Lien', 'Nom', 'Progression']
     
     
    		#########################
    		#  Window Construction  #
    		#########################
     
    		#ListView
    		self.listView = QTableView()
     
     
    		#Progress Barre
    		self.barre = QProgressBar(self)
    		self.barre.reset()
    		self.barre.setRange(0, 0)
    		self.barre.setValue(0)
     
    		#####################
    		#  Window Position  #
    		#####################
     
    		posit = QGridLayout()
    		posit.addWidget(self.listView, 1, 0, 1, 4)
    		posit.addWidget(self.barre, 7, 0, 1, 4)
    		self.setLayout(posit)
     
     
     
    		#################################
    		#  Check Option/Update/Session  #
    		#################################
    		self.refreshTable()
     
     
    	# Table Model
    	#========================================================================
    	def MyTableModel(self):
    		pm = QStandardItemModel()
    		count = 0
    		for header in self.tmheader:
    			pi = QStandardItem(header)
    			pm.setHorizontalHeaderItem(count, pi)
    			count+=1
    		countRow=0
     
    		for fileinfos in self.fileList:
    			firstColumn = QStandardItem(QIcon(self.fileList[countRow][2]), self.fileList[countRow][0])
    			secondColumn = QStandardItem(self.fileList[countRow][1])
     
    			pm.setItem(countRow,0,firstColumn)
    			pm.setItem(countRow,1,secondColumn)
     
    			countRow+=1
    		return pm
     
    	# Mise a jour des donnée du tableau
    	#========================================================================
    	def refreshTable(self):
    		pm = self.MyTableModel()
    		self.listView.setModel(pm)
    		self.listView.setIconSize(QSize(32, 32))
    		self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)
     
    		self.listView.setItemDelegateForColumn(2,ProgressBarDelegate(self, self.fileList))
    		self.listView.setColumnWidth(0, 260)
    		self.listView.setColumnWidth(1, 200)
    		self.listView.setColumnWidth(2, 380)
     
     
     
    class ProgressBarDelegate(QItemDelegate):
    	def __init__(self, owner, itemslist):
    		QItemDelegate.__init__(self, owner)
    		self.itemslist = itemslist
     
    	def sizeHint(self, option, index):
    		return QSize(120, 30)
     
    	def paint(self, painter, option, index):
    		opts = QStyleOptionProgressBarV2()
    		opts.rect = option.rect
    		opts.minimum = 1
    		opts.maximum = 100
     
    		percent = self.itemslist[index.row()][3]
    		opts.progress = percent
     
    		if percent == 0:
    			opts.textVisible = False
    		else:
    			opts.textVisible = True
     
    		opts.text = QString('%d%%'%percent)
    		QApplication.style().drawControl(QStyle.CE_ProgressBar, opts, painter)
     
    #############################################################################
    if __name__ == "__main__":
    	app = QApplication(sys.argv)
    	fen = mainWidget()
    	fen.setWindowTitle("TableView with Delegated ProgressBar")
    	fen.show()
    	sys.exit(app.exec_())
    j'aimerai donc juste pourvoir donner la même style au progresse bar a l'interieur de ma tableview que celle à l'exterieur

    Merci beaucoup

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Au lieu de déclarer ta styleSheet avec QApplication tu peux directement la déclarer sur ton widget.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.progressBar.setStyleSheet("QProgressBar:....
    Donc essayes dans ton delegate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.setStyleSheet(....
    faudra peut-être faire quelques réglages hein.

    C'est étrange, mais avec cette styleSheet, le pourcentage n'est plus centré mais calé en haut à gauche. Sous Linux en tout cas.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Merci,

    J'avais déjà essayé mais dans ces deux cas:

    1] dans ma calss delegate, dans le __init__:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    self.setStyleSheet(
    	 "QProgressBar {color:black; text-align:center; font-weight:bold; padding:2px;}"
    	 "QProgressBar:chunk {background-color: #0088dd; width: 10px; margin-left:1px;}"
    )
    2] dans ma fonction refreshTable():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    progress = ProgressBarDelegate(self, self.fileList)
    progress.setStyleSheet(
    	 "QProgressBar {color:black; text-align:center; font-weight:bold; padding:2px;}"
    	 "QProgressBar:chunk {background-color: #0088dd; width: 10px; margin-left:1px;}"
    )
    j'ai pour résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AttributeError: 'ProgressBarDelegate' object has no attribute 'setStyleSheet'

    C'est étrange, mais avec cette styleSheet, le pourcentage n'est plus centré mais calé en haut à gauche. Sous Linux en tout cas.
    bizarre en effet, il me semble pas avoir eu le problème, je revérifierai =)

  4. #4
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    je continue de chercher de mon coté,

    j'ai trouver quelque chose qui se rapproche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class ProgressBarDelegate(QStyledItemDelegate):
        [...]
        def paint(self, painter, option, index):
            [...]
            opts.palette.setColor(QPalette.Normal, QPalette.Text,Qt.blue);
    ce qui met la couleur du pourcentage en bleu,
    y à t'il un moyen de faire quelque chose de similaire pour les chunk de la progressBar ?

  5. #5
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    aaH

    c'est bon j'ai enfin trouver à force de bidouiller,
    j'ai tenté de changer tout les ColorRole jusqu'a temps de trouver le bon, et voila celui qui correspond au chunk des progress bar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    opts.palette.setColor(QPalette.Highlight, Qt.green)

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut Une barre de progression qui a progressé.
    Voila qui mérite quelques lignes de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # -*- coding: utf-8 -*-
     
    import datetime
     
    begin = datetime.datetime(2011, 05, 05, 12, 01, 00)
    today = datetime.datetime(2011, 9, 29, 15, 14, 00)
    tot = str(today - begin)
    vals = tot.split()
    hms = vals[-1].split(":")
    print "xxkirastarothxx a mis {0} jours, {1} heures, {2} minutes pour trouver comment colorer le chunk d'une barre de progression".format(vals[0], hms[0], hms[1])
    xxkirastarothxx a mis 147 jours, 3 heures, 13 minutes pour trouver comment colorer le chunk d'une barre de progression

    Tu as au moins choisi couleur or ...

  7. #7
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Quel salaud

    Mais en même temps... pour le stylage de delegateitem dans un QAbstractTableModel,

    1] C'est ni avec la doc ni avec les exemples de pyqt qu'on trouve sur google que j'aurais pu avoir ma réponse (sauf si c'est juste pour changer la couleur du texte à la rigueur)

    2] Quasiement toute les tutos/exemples de Qt un peu plus complexe que la moyenne sont fait via des éditeurs visuel (pour les naabs qui savent pas programmer ça ^^)

    3] Même sur les forums spécialisé ou je suis passé personne n'a su me répondre,

    et
    4] C'est mon premier prog avec Qt, c'était pas du tout urgent, j'ai préféré avancer dans les fonctionnalités de mon logiciel (que tu as peu être pu voir sur le forum ubuntu) plutôt que de bloqué sur les couleurs de ma progressbar;

    Alors si c'est pour susciter ce genre de réponse, la prochaine fois je garde la soluce pour moi, hein

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Hi,

    Je ne peux pas le retrouver parce que c'est trop loin, mais il y a une réponse de Phil Thomson sur la ML de PyQt qui est: "la doc PyQt est un bug"

    Cela dit, ce n'est pas spécifique à Qt, voir OpenCv ou Sphinx, pour ceux qui me viennent directement à l'esprit.

    On est censé utiliser des bibliothèques pour ne pas perpétuellement réinventer la roue, mais quand on pense au temps passé à maitriser ces outils on réalise que l'open source n'a pas encore atteint sa maturité.



    ...



    Mais bon, tout de même, 147 jours, c'est un peu exagéré là.

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

Discussions similaires

  1. DataGrid; styler le header;
    Par Kapitteli dans le forum ASP.NET
    Réponses: 3
    Dernier message: 01/09/2007, 12h11
  2. Styler le lien correspondant à la page en cours
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 07/05/2007, 14h19
  3. styler un input de type file
    Par Methode dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 11/01/2007, 23h11
  4. styler ses tableaux
    Par Methode dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 03/01/2007, 23h37
  5. [ SWING ] Styler un JInternalFrame
    Par Invité dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 12/02/2006, 17h37

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