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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    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 éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    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 éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 ...

+ 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