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 :

Problème de stylesheet QScrollArea


Sujet :

PyQt Python

  1. #1
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut Problème de stylesheet QScrollArea
    Bonjour,
    comme un screen est plus parlant que de longue phrase pour le stylesheet voici :
    Nom : tempo.png
Affichages : 673
Taille : 3,9 Ko

    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    self.windowItem = QtWidgets.QDialog(self.mainWindow, windowTitle="Item à craft", windowIcon=QtGui.QIcon(os.path.join("icon", "liste.png")))
    self.layoutItem = QtWidgets.QVBoxLayout(self.windowItem)
    scrollArea = QtWidgets.QScrollArea(objectName="test")
    self.layoutItem.addWidget(scrollArea)
    scrollAreaWidgetContents = QtWidgets.QWidget(objectName="test")
    scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 300, 800))
    scrollArea.setWidget(scrollAreaWidgetContents)
    self.layoutItem = QtWidgets.QVBoxLayout(scrollAreaWidgetContents, objectName="test")
    self.layoutItem.setAlignment(QtCore.Qt.AlignTop)
    self.windowItem.show()
    et plus loin dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.layoutItem.addWidget(QtWidgets.QLabel(text=self.quantite.text() + "x " + self.comboboxItem.currentText()))
    dans mon fichier stylesheet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QMainWindow, QDialog, QMenuBar, QMenu #test {
    	background: blue;
    }
    Je voudrait faire en sorte que la partie scrollable soit également en bleu (la couleur bleu c'est juste pour tester) et si possible faire en sorte que la scrollarea soit coller contre les bordures de ma fenêtre.

  2. #2
    Expert éminent

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

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

    Les bordures entre les widgets s'ajustent avec le layout qui les contiennent, donc dans ton cas quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.layoutItem = QtWidgets.QVBoxLayout(self.windowItem)
    self.layoutItem.setContentsMargins(0, 0, 0, 0)
    Pour les styleSheet, elles doivent être déclarées entièrement en texte.

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    buttonstyle = """QToolButton {background: #1A1C20;
                        border: transparent;}
                    QToolButton:hover {border: 2px solid #CC1D00;
                        border-radius: 4px;}
                    QToolButton:pressed {background: qlineargradient(
                        x1: 0, y1: 0, x2: 0, y2: 1,
                    stop: 0 #dadbde, stop: 1 #F6F7Fa);}"""
     
    self.button.setStyleSheet(buttonstyle)
    Les widgets contenus héritent du style de leur widget conteneur. Si ça ne convient pas il faut leur appliquer à leur tour d'autres styleSheet. Quand on commence ...

    Ici un très grand nombre d'exemples.

  3. #3
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Pour les styleSheet, elles doivent être déclarées entièrement en texte.
    En faite j'utilise ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open(os.path.join("stylesheet.css"),"r") as file:
    	app.setStyleSheet(file.read())
    Mes deux problèmes sont résolus merci, cependant je me suis rendu compte d'un autre problème, qui est plus un problème de conception : en effet les QLabel se chevauchaient les uns sur les autres quand ils étaient en grand nombre du à la dimension fixe de mon scrollAreaWidgetContents.

    Pour y remédier j'ai fait ça :
    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
     
    ...
    class Main():
    	def __init(self):
    		...
    		self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 400, 100))
    		...
    	def add_item_in_list_craft(self):
    		...
    		itemToCraft = QtWidgets.QLabel(text=self.quantite.text() + "x " + self.comboboxItem.currentText(), objectName="itemToCraft")
    		print(itemToCraft.height())
    		print(self.scrollAreaWidgetContents.height())
    		self.layoutItem.addWidget(itemToCraft)
    		self.scrollAreaWidgetContents.setGeometry(0, 0, 400, self.scrollAreaWidgetContents.height() + itemToCraft.height())
     
    		self.windowItem.setMaximumSize(400, self.scrollAreaWidgetContents.height() + itemToCraft.height())
    		...
    Sauf que itemToCraft.height() renvoie 480, peu importe le font( itemToCraft.setFont(...) ou itemToCraft.setStyleSheet(...) )

    PS: itemToCraft.geometry() me renvoie PyQt5.QtCore.QRect(0, 0, 640, 480), le 640 ne me choque pas mais le 480 plutôt... sa fait haut pour une ligne de texte, pourtant mon texte est pas au format 3/4 ...
    Ma solution marche, mais au bout de quelques appelles de la fonction add_item_in_list_craft le scrollAreaWidgetContents fait 3km de long quand il devrait en faire 50x moins... du coup ma scrollbar fait descendre 50x trop en bas :'(
    exemple :
    Nom : Sans titre.png
Affichages : 606
Taille : 16,5 Ko

    il faudrait que je puisse récupérer la vraie hauteur que prend mon QLabel

  4. #4
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Bon j'ai trouvé la solution, je vois pas trop la logique derrière mais bon ^^

    il me suffit de faire itemToCraft.show(), par contre j'imagine que le setSpacing du layout rentre également en jeu(après test en effet c'est ce que je pensait, au bout de plus de 50 lignes les Qlabels se chevauchent à nouveau).

    Dans ce cas il faut que je fasse self.scrollAreaWidgetContents.setGeometry(0, 0, 400, self.scrollAreaWidgetContents.height() + itemToCraft.height() + self.layoutItem.spacing() ) par contre j j'ai quand même une petite zone vide de la taille du self.scrollAreaWidgetContents de base ... c'est assez logique , bon j'imagine que le seul d'empêcher ça est de faire une condition du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var += itemToCraft.height() + self.layoutItem.spacing()
    if var > 100 - itemToCraft.height() - self.layoutItem.spacing(): #self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 400, 100))
    	self.scrollAreaWidgetContents.setGeometry(0, 0, 400, self.scrollAreaWidgetContents.height() + itemToCraft.height() + self.layoutItem.spacing() )

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

Discussions similaires

  1. Problème affichage dans QScrollArea
    Par betsprite dans le forum Débuter
    Réponses: 3
    Dernier message: 04/03/2011, 01h12
  2. problème : QScrollArea et layout
    Par jackywar dans le forum Débuter
    Réponses: 1
    Dernier message: 06/04/2009, 10h36
  3. [Designer-qt4] Problème de stylesheet
    Par Michaël dans le forum Qt
    Réponses: 2
    Dernier message: 23/01/2007, 11h47
  4. problème avec StyleSheet.getSyle()
    Par bitbis dans le forum Flash
    Réponses: 1
    Dernier message: 29/10/2006, 14h54

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