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 :

Ajouter une CheckBox dans un QFileDialog


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut Ajouter une CheckBox dans un QFileDialog
    Bonsoir,

    Je me remets à programmer en pyqt5 après une bonne pause...

    et là je cherche comment créer un QFileDialog dans lequel je voudrais ajouter 2 QCheckBox.

    Est-il possible de faire ça simplement ou faut il tout recréer depuis 0 dans une QWindow ?

    Merci d'avance pour vos idées et propositions

    Bonne année à vous !

    Edit :

    je pensais à un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class DialogWithCheckBox(QMessageBox):
        def __init__(self, parent=None):
            super(DialogWithCheckBox, self).__init__()
     
            self.checkbox = QCheckBox()
     
            layout = self.layout()
            layout.addWidget(self.checkbox, 1, 1)
            layout.setAlignment(self.checkbox, Qt.AlignRight)
     
     
        def exec_(self, *args, **kwargs):
            return(QMessageBox.exec_(self, *args, **kwargs), self.checkbox.isChecked())
    adapté à QFileDialog mais, il n'y a pas de layout dans QFileDialog à priori...


    HS : Je viens de voir que QMessageBox, propose une option de QCheckBox depuis la version Qt 5.2

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    N'ayant rien trouvé sur le sujet, je suis partis la dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            self.Window = QDialog(self)
            self.Window.resize(self.geometry().width() - 20 , self.geometry().height() - 20)
            VerticalLayout = QVBoxLayout(self.Window)
            CheckBox = QCheckBox(self.Trad["Convert0"])
            self.SelectFile = QFileDialog()
            self.SelectFile.setObjectName("SelectFile")
            self.SelectFile.setOption(QFileDialog.DontUseNativeDialog)
            VerticalLayout.addWidget(self.SelectFile)
            VerticalLayout.addWidget(CheckBox)
            self.Window.exec()
    Le truc c'est que je ne veux valider la séléction que via le bouton Ouvrir, mais lorsque je clique sur un fichier, pouf, il se ferme.
    Du coup je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.SelectFile.done = self.cacatest # renvoie 0 ou 1 en fonction de la selection ou de l'annulation
    pour bloquer la fermeture.

    Mais le truc c'est que même avec un eventfiltrer, impossible de trouver l'event apres un clic sur le bouton.

    Donc j'arrive à chopper le nom du fichier et à connaitre la valeur de sortie (0 ou 1) mais impossible de repérer lorsque le bouton est pressé...
    une idée ?

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour hizoka,

    Je t'aiderais volontiers parce que j'ai déjà fait des QFileDialog personnalisés, mais je ne comprends pas ce que tu veux faire. Où veux-tu mettre des QCheckBox et pourquoi faire?

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut, merci de ta proposition.

    je veux simplement ajouter une case à cocher du genre : Toujours utiliser ce dossier

    Et la mon problème, c'est simplement que je veux ne fermer la fenêtre que lorsque j'appuie sur "Ouvrir" et non lorsque je sélectionne un fichier.
    Mais ma méthode est surement bancale !

    Donc je te laisse m'exposer tes techniques

    EDIT : j'ai hate de voir ce que tu vas proposer car je n'ai rien trouvé qui aille vraiment dans ce sens, beaucoup de question mais peu de réponse...

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà comment on peut faire.

    D'abord, comme il n'est pas possible de modifier le dialogue natif de l'OS, il faut utiliser le dialogue de Qt avec l'option QtWidgets.QFileDialog.DontUseNativeDialog.

    Ensuite, si on veut non seulement ajouter un QCheckBox, mais provoquer d'autres modifications, il vaut mieux créer une nouvelle classe héritant de QFileDialog, et définir les méthodes qu'il faut de type getOpenFileName.

    Tu as bien vu qu'il y avait déjà un layout dans le QFileDialog: il se trouve facilement ici: layout=self.layout(), et si tu fais un print(type(layout)), tu vois que c'est un QtWidgets.QGridLayout: on sait donc l'utiliser, et c'est ce qu'on va faire!

    Voilà un code test:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3 PyQt5
     
    import sys, os
     
    from PyQt5 import (QtCore, QtGui, QtWidgets)
     
    #############################################################################
    class FileDialog(QtWidgets.QFileDialog):
     
        #========================================================================
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
        #========================================================================
        def getOpenFileName(self, parent=None, 
                        caption="Sélectionnez un fichier", 
                        dir=".", 
                        filter="All files (*.*)", 
                        selectedFilter="", 
                        options=None):
     
            #--------------------------------------------------------------------
            # configuration de la fenêtre de dialogue: à vérifier que c'est complet!
            self.setWindowTitle(caption)
            self.setDirectory(dir)
            self.setNameFilter(filter)
            self.setFileMode(QtWidgets.QFileDialog.ExistingFile)
            self.setAcceptMode(QtWidgets.QFileDialog.AcceptOpen) # bouton "Ouvrir"
            if selectedFilter!="":
                self.selectNameFilter(selectedFilter)
            if options!=None:
                self.setOptions(options)
     
            self.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
     
            #--------------------------------------------------------------------
            # on ajoute un QCheckBox à la fenêtre de dialogue
            layout = self.layout()
            self.cbox = QtWidgets.QCheckBox("Mon checkbox", self)
            layout.addWidget(self.cbox, 4, 0)
            self.setLayout(layout)
     
            # on va cocher la case à titre d'exemple
            self.cbox.setCheckState(QtCore.Qt.Checked)
     
            #--------------------------------------------------------------------
            # interaction avec l'utilisateur et retour du résultat 
            if self.exec_():
                return list(self.selectedFiles())[0]
            else:
                return ""
     
    #############################################################################
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        fileDialog = FileDialog()
        fichier = fileDialog.getOpenFileName(None, "titre")
        print(fichier)
    On voit en exécutant que la fenêtre de dialogue comporte une ligne supplémentaire avec le QCheckBox coché et le texte qu'on a voulu.

    Il faut bien sûr ajouter l'option dans les arguments de la méthode getOpenFileName pour cocher ou non la case, et lui mettre le bon texte. On devrait aussi pouvoir récupérer la coche en l'ajoutant à ce qui est retourné quand on clique sur le bouton "ouvrir".

    Je ne sais toujours pas à quoi ça sert, mais c'est ça qui colle le mieux avec ce que j'ai compris...


    Pour aller plus loin dans les modifs, imaginons maintenant qu'on veuille accéder séparément à tous les widgets du QFileDialog. Il suffit d'ajouter avant la ligne de l'exe_ le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            print("Enfants de QFileDialog.getOpenFileName")
            enfants = self.children()
            for i, enfant in enumerate(enfants):
                print("=>", i, type(enfant))
    Ce qui affichera:

    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
    Enfants de QFileDialog.getOpenFileName
    => 0 <class 'PyQt5.QtWidgets.QFileSystemModel'>
    => 1 <class 'PyQt5.QtWidgets.QSizeGrip'>
    => 2 <class 'PyQt5.QtWidgets.QGridLayout'>
    => 3 <class 'PyQt5.QtWidgets.QLabel'>
    => 4 <class 'PyQt5.QtWidgets.QComboBox'>
    => 5 <class 'PyQt5.QtWidgets.QToolButton'>
    => 6 <class 'PyQt5.QtWidgets.QToolButton'>
    => 7 <class 'PyQt5.QtWidgets.QToolButton'>
    => 8 <class 'PyQt5.QtWidgets.QToolButton'>
    => 9 <class 'PyQt5.QtWidgets.QToolButton'>
    => 10 <class 'PyQt5.QtWidgets.QToolButton'>
    => 11 <class 'PyQt5.QtWidgets.QSplitter'>
    => 12 <class 'PyQt5.QtWidgets.QLabel'>
    => 13 <class 'PyQt5.QtWidgets.QLineEdit'>
    => 14 <class 'PyQt5.QtWidgets.QDialogButtonBox'>
    => 15 <class 'PyQt5.QtWidgets.QLabel'>
    => 16 <class 'PyQt5.QtWidgets.QComboBox'>
    => 17 <class 'PyQt5.QtWidgets.QCompleter'>
    => 18 <class 'PyQt5.QtWidgets.QActionGroup'>
    => 19 <class 'PyQt5.QtWidgets.QAction'>
    => 20 <class 'PyQt5.QtWidgets.QAction'>
    => 21 <class 'PyQt5.QtWidgets.QAction'>
    => 22 <class 'PyQt5.QtWidgets.QAction'>
    => 23 <class 'PyQt5.QtWidgets.QAction'>
    => 24 <class 'PyQt5.QtWidgets.QAction'>
    => 25 <class 'PyQt5.QtWidgets.QCheckBox'>
    On voit bien qu'il a trouvé le QGridLayout, et si on affiche self.layout==enfants[2], ça donne bien True!

    On voit aussi qu'il trouve bien le QCheckBox qu'on vient d'ajouter. Il est là: enfants[25].

    On peut ainsi modifier le texte des labels, par exemple (il faudra tenir compte des mécanismes de traduction!), ou n'importe quoi d'autre.

    L'affichage des répertoires et des fichiers se trouve dans le QSplitter (enfants[11]) qui fonctionne un peu comme un layout. Je suppose qu'il y a un QListView sur la gauche et un QTreeView sur la droite avec le modèle QFileSystemModel qu'on a trouvé aussi (enfants[0]), mais je ne suis pas allé plus loin.

    On devrait pouvoir aussi accéder au mécanisme des signaux qui interviennent dans la sélection des fichiers par exemple. Je n'ai pas dit que c'était facile... Peut-être faudrait-il se faire aider par la consultation du code source en C++?

    Ok?

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut,

    merci, à la base j'étais parti en effet sur le layout de la fenêtre, mais ça m'affichait une erreur, j'avais du me planté quelque part...

    ton système permet une bonne personnalisation, ça c'est certain mais... la fenêtre se ferme toujours lorsque je clique sur un fichier ! Je voudrais qu'elle se ferme uniquement à l'utilisation des boutons (ouvrir ou annuler).

    qt 5.5

Discussions similaires

  1. Ajout entete checkbox dans une colonne d'une datagridview
    Par pbatty1 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 31/07/2009, 10h17
  2. Réponses: 3
    Dernier message: 16/06/2008, 17h27
  3. Ajouter une action dans une liste de checkbox
    Par kstou2001 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 09/08/2007, 19h06
  4. Ajout d'une checkbox dans une datawindow
    Par cradleofpain dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 23/04/2007, 09h23
  5. Ajouter une icone dans la barre des titres (cme emule)
    Par Crisanar dans le forum Windows
    Réponses: 7
    Dernier message: 12/12/2004, 12h08

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