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

  1. #1
    Membre confirmé
    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
    Points : 460
    Points
    460
    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
    Sous Kubuntu 20.04

  2. #2
    Membre confirmé
    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
    Points : 460
    Points
    460
    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 ?
    Sous Kubuntu 20.04

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    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?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre confirmé
    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
    Points : 460
    Points
    460
    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...
    Sous Kubuntu 20.04

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    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?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre confirmé
    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
    Points : 460
    Points
    460
    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
    Sous Kubuntu 20.04

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par hizoka Voir le message
    la fenêtre se ferme toujours lorsque je clique sur un fichier !
    Ça, c'est anormal, et ce n'est pas comme ça chez moi (Windows 10, Python 3.4, PyQt5.5). Il faut cliquer sur le bouton "open" ou "cancel" pour que le fichier sélectionné soit retourné et la fenêtre de dialogue fermée. Ce n'est que si on double-clique sur un nom de fichier que la fenêtre disparait tout en retournant le fichier sélectionné. C'est le fonctionnement habituel des programmes sous Windows.

    Tu travailles sous quel OS?

    [edit] je viens d'essayer sous Linux (linumint version 17.2 issu d'Ubuntu): ça marche comme sous Windows!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    En fait mon problème est valable aussi pour un QFileDialog normal...
    il me ferme la fenêtre après un SIMPLE CLIC sur un fichier, il n'attend pas que je valide via le bouton.
    galère galère... je vois pas trop comment contourner le problème...

    je suis sous kubuntu 15.10
    Python 3.4.3+
    Qt 5.4.2


    Sinon ta façon de faire est sympa
    Sous Kubuntu 20.04

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Comme je viens de le dire plus haut, je viens d'essayer sous Linux, et ça marche comme sous Windows!

    Linux Mint v17.2 bureau cinnamon
    Python 3.4.0
    PyQt 5.2.1

    Les modules Python et PyQt sont issus d'Ubuntu

    Le bureau KDE de Kubuntu peut-il expliquer une telle différence de comportement? Alors que Qt est justement spécialisé pour construire KDE!

    [edit] essaie avec un programme non-python qui a un tel dialogue!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    C'est trés étrange en effet, il va falloir que je teste sur un liveusb ou sur un autre linux.

    je vous tiens au courant.

    merci à toi.

    Mais je ne suis pas le seul à priori : http://stackoverflow.com/questions/2...hen-click-open

    Je viens de tester avec un autre logiciel (qui n'est pas de moi) en pyqt4 et ça fait pareil
    et idem avec un logiciel en c++ et qt
    Sous Kubuntu 20.04

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Je viens de tester avec un autre logiciel (qui n'est pas de moi) en pyqt4 et ça fait pareil
    et idem avec un logiciel en c++ et qt
    Alors, c'est Kubuntu le responsable? Ou les conditions particulières d'installation de l'OS sur ta machine?

    Essaie avec un autre Linux.

    Je pense que chaque distribution a un bureau préféré qui implique le maximum de moyens, les autres bureaux étant moins bien travaillés. Et chez Ubuntu, c'est plutôt le descendant de gnome la priorité et non KDE.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  12. #12
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Il est clair que Kubuntu est délaissé...

    Sinon je suis partit là dessus en attendant qui je trouve permet au code d'être facilement repris :
    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
    class FileDialog(QFileDialog):
        #========================================================================
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
     
        #========================================================================
        def getExistingDirectory(self, parent=None, WidgetToAdd=None, Title="QFileDialog", PathDir=".", Filter="All files (*.*)", SelectedFilter="", Options=None):
     
            #--------------------------------------------------------------------
            # configuration de la fenêtre de dialogue: à vérifier que c'est complet!
            self.setWindowTitle(Title)
            self.setDirectory(PathDir)
            self.setFileMode(QFileDialog.Directory)
            self.setAcceptMode(QFileDialog.AcceptOpen)
            if Options!=None:
                self.setOptions(Options)
     
            self.setOption(QFileDialog.DontUseNativeDialog, True)
            self.setOption(QFileDialog.ShowDirsOnly, True)
     
            #--------------------------------------------------------------------
            # on ajoute le widget à la fenêtre de dialogue
            layout = self.layout()
            layout.addWidget(WidgetToAdd, 4, 0, 4, 3)
     
            #--------------------------------------------------------------------
            # interaction avec l'utilisateur et retour du résultat
            if self.exec_():
                return list(self.selectedFiles())[0]
            else:
                return ""
     
     
    ..........
     
            BigWidget = QWidget()
            BigLayout = QVBoxLayout()
            cbox1 = QRadioButton(self.Trad["Convert7"], BigWidget)
            cbox2 = QRadioButton(self.Trad["Convert8"], BigWidget)
            cbox3 = QRadioButton(self.Trad["Convert9"], BigWidget)
            cbox1.setChecked(True)
            BigLayout.addWidget(cbox1)
            BigLayout.addWidget(cbox2)
            BigLayout.addWidget(cbox3)
            BigWidget.setLayout(BigLayout)
     
            fileDialog = FileDialog()
            fichier = fileDialog.getExistingDirectory(None, BigWidget, self.Trad["Convert6"], QDir.path(QDir(str(File.parent))))
     
            print(fichier, cbox1.isChecked(), cbox2.isChecked(), cbox3.isChecked())
    Merci à toi
    Sous Kubuntu 20.04

  13. #13
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Salut,

    grâce à toi j'arrive à contourner mon souci de fermeture au clic :
    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
    class QFileDialogCustom(QFileDialog):
        #========================================================================
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
            # Initialisation de la valeur de retour
            self.retour = ""
     
     
        #========================================================================
        def done(self, value):
            ### En fonction de la valeur, on récupère une valeur ou non avant de fermer la fenêtre
            if value == 0:
                self.retour = ""
                self.hide()
     
            elif value == 1:
                try: self.retour = list(self.selectedFiles())[0]
                except: self.retour = ""
     
            elif value == 2:
                try:
                    self.retour = list(self.selectedFiles())[0]
                    self.hide()
                except:
                    pass
     
     
        #========================================================================
        def test(self, value):
            ### Dit à done que le bouton valider à été utiliser (ne renvoie pas 0 mais 2 pour court-circuiter le souci de fermeture à la sélection de fichier)
            if self.enfants[15].buttonRole(value) == 0: self.done(2)
     
     
        #========================================================================
        def getExistingDirectory(self, parent=None, WidgetToAdd=None, Title="QFileDialog", PathDir=".", Icon=None, Options=None):
            ### Configuration de la fenêtre de dialogue
            self.setWindowTitle(Title)
            self.setDirectory(PathDir)
            self.setFileMode(QFileDialog.Directory)
            self.setAcceptMode(QFileDialog.AcceptOpen)
            self.setOption(QFileDialog.DontUseNativeDialog, True)
            self.setOption(QFileDialog.ShowDirsOnly, True)
            if Icon != None: self.setWindowIcon(QIcon.fromTheme(Icon, QIcon(":/img/{}.png".format(Icon))))
            if Options != None: self.setOptions(Options)
     
            ### Ajout du widget à la fenêtre de dialogue
            if WidgetToAdd != None:
                layout = self.layout()
                layout.addWidget(WidgetToAdd, 4, 0, 4, 3)
     
            ### Court-circuitage des boutons
            self.enfants = self.children()
            self.enfants[15].clicked.connect(self.test)
     
            ### Affichage de la fenêtre
            self.exec()
     
            ### Retour de la valeur choisie
            if Path(self.retour).is_dir(): return self.retour
            else: return ""
    juste un truc que je pige pas, c'est ce layout = self.layout(), d'où vient il ? Que veut il dire là ?
    Autre truc comment travailler avec le nom du buttonBox plutot qu'avec self.enfants[15] car le widget s'appelle buttonBox mais il dit ne pas le connaitre.

    Dans tous les cas merci à toi !!
    Sous Kubuntu 20.04

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ravi de voir que tu avances!

    Citation Envoyé par hizoka Voir le message
    juste un truc que je pige pas, c'est ce layout = self.layout(), d'où vient il ? Que veut il dire là ?
    Dans cette expression, layout est une variable locale crée à cette occasion, et self.layout() est la méthode de QFileDialog qui renvoie l'adresse du layout existant (qui est un QGridLayout): j'ai trouvé cette méthode dans la doc C++, sinon, j'aurais pris mon self.enfants[2].

    Citation Envoyé par hizoka Voir le message
    Autre truc comment travailler avec le nom du buttonBox plutot qu'avec self.enfants[15] car le widget s'appelle buttonBox mais il dit ne pas le connaitre.
    il faudrait voir comment tu as défini ton buttonBox: donne cette partie du code.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    ok merci pour le layout, j'avais pas trouvé l'option..

    il faudrait voir comment tu as défini ton buttonBox: donne cette partie du code.
    C'est pas moi qui l'ai mis, il y est pas défaut et c'est l'enfant 15.
    Sous Kubuntu 20.04

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Peut-être que si tu faisais:

    "self.WidgetToAdd = WidgetToAdd" au début de la méthode getExistingDirectory,

    et

    "layout.addWidget(self.WidgetToAdd, 4, 0, 4, 3)" dans l'ajout au layout


    tu pourrais réutiliser cette adresse dans d'autres parties du code ?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  17. #17
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Je vais voir ce que je peux faire de ce que tu me proposes


    Je rencontre un autre souci chiant, c'est au niveau graphique, c'est pas top :

    normalement :
    Nom : capture d'écran8.png
Affichages : 1089
Taille : 42,1 Ko

    et avec DontUseNativeDialog :
    Nom : capture d'écran9.png
Affichages : 1029
Taille : 53,8 Ko
    le menu de gauche n'est pas rempli de la même façon mais surtout il n'y a pas d'icone.

    j'ai essayé avec l'option DontUseCustomDirectoryIcons mais pas de changement.
    Sous Kubuntu 20.04

  18. #18
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    J'ai repris mon 1er code personnalisé (voir + haut), et je constate que, sous Windows, j'ai absolument tous les icônes de fichiers et de répertoires, à droite comme à gauche, sans avoir rien fait pour les obtenir.

    Est-ce encore un pb spécifique à Kubuntu?

    A noter que tu peux modifier le contenu de la partie gauche avec la méthode "setSidebarUrls"

    J'en ai profité pour vérifier que ce que je t'ai raconté sur l'accès au widget ajouté: ça a l'air de marcher. Pour reprendre mon code de test avec la case à cocher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        fileDialog = FileDialog()
        fichier = fileDialog.getOpenFileName(None, "titre")
        print(fichier, fileDialog.cbox.isChecked()) # ===> dit au retour si la case est cochée ou non
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  19. #19
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    pfff ça me gonfle si c'est du à Kubuntu...

    il faut vraiment que je teste sur un autre kde.

    pas mal ton exemple en effet !

    je continue mes expériences
    Sous Kubuntu 20.04

  20. #20
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Je voudrais essayer d'améliorer mon système en utilisant l'event mouseDoubleClickEvent mais il ne fonctionne pas sur la liste des fichiers, uniquement sur la boite en elle même, j'essaie de l’implanter dans la liste des fichiers mais sans sucés, est ce possible ? et si oui comment car là je viens de tester pas mal de trucs...


    Merci
    Sous Kubuntu 20.04

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