Résolue

QWidget pour tracer des rectangles.

# Interface graphique # PySide

Bonjour

suite à la formation je me suis plongé dans le site PySide qui est beaucoup moins "userfriendly" que les cours de Docstring.

Je voudrais dessiner dans un layout un damier de 10x10 cases.


je n'arrive pas à trouver un widget qui convienne, pouvez vous me donner une piste ?


Merci


Thibault houdon

Mentor

Bonjour Jean-Marc,


Ça va dépendre de quelle est la finalité de ton programme. Est-ce que les cases du damier par exemple doivent être "clickable" ?


Ce qui t'offrira le plus de flexibilité, ce sont les QGraphicsView (et les QGraphicsItem), qui te permettent de dessiner n'importe quel type de forme, mais c'est encore une autre logique que les layout et widgets que je montre dans ma formation.

Bonjour Thibault

Oui je souhaiterais qu'ils soient cliquables.

J'ai bien noté l'existence des QGraphicsView, mais effectivement cela ne fonctionne pas comme un widget.

Tu peux me dire ou je trouverai de la doc sur ce sujet?


Merci

Thibault houdon

Mentor

Bonjour Jean-Marc,


Dans ce cas je te conseille de simplement partir sur un QGridLayout avec des QPushButton que tu stylise (avec une feuille de style).


Tu fais une grille de 10x10, et tu peux jouer sur le contents margin et spacing pour que le damier soit collé :

https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QLayout.html#PySide2.QtWidgets.PySide2.QtWidgets.QLayout.setContentsMargins

https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QLayout.html#PySide2.QtWidgets.PySide2.QtWidgets.QLayout.setSpacing


Tu mets les contents margin et le spacing à 0 et tu mets tes QPushButton en flat (setFlat(True)) et ça devrait te permettre d'avoir ce que tu souhaites :)


Voilà pour les pistes, je te laisse explorer tout ça et n'hésite pas si tes tests ne sont pas concluants (on pourra en parler aussi à la session de mentorat de cet après-midi à 14h si tu es disponible !)

Merci

Je vais participer à la session.


Bonjour Thibault

Merci pour cette session. J'ai de quoi faire :)

comment puis je retrouver le script?


Merci encore pour la qualité de l'information.



Thibault houdon

Mentor

Bonsoir Jean-Marc :)


J'avais posté le code dans la communauté en annonçant la rediffusion, je te le remet ici (et je vais rajouter une fonctionnalité pour pouvoir attacher / partager les scripts qui ont été vus pendant la session dans les rediffusions pour les prochaines !) :


import itertools
from PySide6 import QtWidgets, QtCore, QtGui


class MainWindow(QtWidgets.QWidget):
  def __init__(self):
    super().__init__()

    self.setWindowTitle("Damier")

    self.layout = QtWidgets.QGridLayout()
    self.setLayout(self.layout)

    self.layout.setContentsMargins(0, 0, 0, 0)
    self.layout.setSpacing(0)

    switch = False
    bg = "f00"
    fg = "fff"

    for x, y in itertools.product(range(5), range(5)):
      button = QtWidgets.QPushButton()
      button.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)

      self.layout.addWidget(button, x, y)
      button.setStyleSheet(f"""
      QPushButton {{
        background-color: #{bg if switch else fg};
        color: #{fg if switch else bg};
      }}
      QPushButton:pressed {{
        background-color: #0000ff;
      }}
      """)
      switch = not switch

    self.resize(400, 400)


app = QtWidgets.QApplication()
win = MainWindow()
win.show()
app.exec()

Merci Thibault

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.