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

Qt Quick Discussion :

Supprimer définitivement les éléments d'un ListModel


Sujet :

Qt Quick

  1. #1
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut Supprimer définitivement les éléments d'un ListModel
    à tous,

    Ci-dessous un bout de code me permettant d'ajouter dynamiquement des lignes dans un TableView, d'enregistrer le contenu dans un ListModel et éventuellement de supprimer des lignes.

    Mon souci est lié à la suppression d'une ligne. Le code présenté supprime bien la ligne voulue en supprimant le contenu d'un élément du ListModel (remove(index)).

    Cependant si je souhaite par la suite rajouter une ligne, c'est la copie de la ligne supprimée qui réapparaît au lieu d'une ligne vide et je ne vois pas du tout d'où cela peut venir...


    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
    import QtQuick 2.4
    import QtQuick.Window 2.2
    import QtQuick.Layouts 1.1
    import QtQuick.Controls 1.3
     
    ApplicationWindow {
        width: 600
        height: 300
        minimumHeight: height
        maximumHeight: height
        minimumWidth: width
        maximumWidth: width
        visible : true
     
        property var comboModel : [{piece:"Item 1", j:"10"}, {piece:"Item 2", j:"20"}, {piece:"Item 3", j:"30"}, {piece:"Item 4", j:"40"}]
     
     
        GridLayout {
            id : grid
            anchors.fill: parent
            anchors.margins: 5
            columns: 4
            TableView{
                id : table
                Layout.columnSpan: grid.columns
                Layout.fillWidth: true
                Layout.fillHeight: true
                //TableViewColumn {role:"selection" ; title : "" ; width : table.width*0.05 ; delegate : checkDelegate}
                TableViewColumn {role:"selection" ; title : "" ; width : table.width*0.05 ; delegate : btnDelegate}
                TableViewColumn {role:"item" ; title : "Élément" ; width : table.width*0.8-2 ; delegate : comboDelegate}
                TableViewColumn {role:"qte" ; title : "Quantité" ; width : table.width*0.15 ; delegate : editableDelegate}
                rowDelegate : Rectangle{id : rect ;height: 23}
                model : aspiModel
     
            }
     
            Component {
                id: editableDelegate
                TextField {
                    id : textinput
                    onTextChanged{
                        aspiModel.setProperty(styleData.row,styleData.role, text)
                    }
                    onAccepted{
                        textinput.focus = false
                        aspiModel.setProperty(styleData.row,styleData.role, text)
                    }
                    MouseArea {
                        anchors.fill: parent
                        onClicked{
                            textinput.forceActiveFocus()
                        }
                    }
                }
            }
     
            Component {
                id: comboDelegate
                ComboBox {
                    id : combo
                    model: comboModel
                    textRole : "piece"
                    onCurrentTextChanged:aspiModel.setProperty(styleData.row,styleData.role, currentText)
                }
            }
            Component {
                id: checkDelegate
     
                CheckBox {
                    id : check
                    onCheckedChanged: aspiModel.setProperty(styleData.row,styleData.role, checked)
                }
            }
            Component {
                id: btnDelegate
     
                Button {
                    id : id
                    text : "X"
                    onClicked{
                        console.log("Avant remove :", aspiModel.count, " entrées")
                        aspiModel.remove(styleData.row)
                        console.log("Après remove :", aspiModel.count, " entrées")
                    }
                }
            }
     
            ListModel {
                id:aspiModel
            }
     
            RowLayout {
                Layout.columnSpan: grid.columns
                Layout.fillWidth: true
                Button {
                    text : "Ajouter un élément"
                    Layout.fillWidth: true
                    implicitHeight: 40
                    onClicked: aspiModel.append({})
                }
            }
        }
    }
    Une idée ???

    D'avance merci.

    J
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Points : 189
    Points
    189
    Par défaut
    Bonjour,
    Cela ressemble à un bug. En testant ceci :
    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
     
    import QtQuick 2.4
    import QtQuick.Window 2.2
    import QtQuick.Layouts 1.1
    import QtQuick.Controls 1.3
     
    ApplicationWindow {
    	width: 800
    	height: 700
    	minimumHeight: height
    	maximumHeight: height
    	minimumWidth: width
    	maximumWidth: width
    	visible : true
     
    	ListModel {
    		id: comboModel
     
    		ListElement {
    			piece:"Item 1"
    		}
    		ListElement {
    			piece:"Item 2"
    		}
    		ListElement {
    			piece:"Item 3"
    		}
    	}
     
    	GridLayout {
    		id : grid
    		anchors.fill: parent
    		anchors.margins: 5
    		columns: 4
    		TableView{
    			id : table
    			Layout.columnSpan: grid.columns
    			Layout.fillWidth: true
    			height: 300
    			TableViewColumn {role:"piece" ; title : "Élément" ; width : table.width*0.8-2 ; delegate : comboDelegate}
    			rowDelegate : Rectangle{id : rect ;height: 23}
    			model : aspiModel
    		}
    		ListView {
    			id : table2
    			Layout.columnSpan: grid.columns
    			Layout.fillWidth: true
    			height: 300
    			model: aspiModel
    			delegate: comboDelegateForListView
    		}
     
     
    		Component {
    			id: comboDelegate
    			ComboBox {
    				id : combo
    				model: comboModel
    				textRole : "piece"
    				onCurrentTextChanged:aspiModel.setProperty(styleData.row,styleData.role, currentText)
    				Component.onCompleted: console.log("comboDelegate new")
    				Component.onDestruction: console.log("comboDelegate deleted")
    			}
    		}
     
    		Component {
    			id: comboDelegateForListView
    			ComboBox {
    				id : combo
    				model: comboModel
    				textRole : "piece"
    				onCurrentTextChanged:aspiModel.setProperty(index,"piece", currentText)
    				Component.onCompleted: console.log("comboDelegateForListView new")
    				Component.onDestruction: console.log("comboDelegateForListView deleted")
    			}
    		}
     
    		ListModel {
    			id:aspiModel
    		}
     
    		RowLayout {
    			Layout.columnSpan: grid.columns
    			Layout.fillWidth: true
    			Button {
    				text : "Ajouter un élément"
    				Layout.fillWidth: true
    				implicitHeight: 40
    				onClicked: aspiModel.append({})
    			}
    			Button {
    				text : "Supprimer dernier un élément"
    				Layout.fillWidth: true
    				implicitHeight: 40
    				onClicked{
                                            var obj = aspiModel.get(aspiModel.count-1)
                                            console.log("obj : " + obj)
                                            aspiModel.remove(aspiModel.count-1)
                                    }
    			}
    		}
    	}
    }
    on s'aperçoit que ListView n'a pas ce problème.
    Le problème est que TableView ne détruit pas le delegate associé à l'élément du model qui à été supprimé.
    C'est un bug très gênant. Je n'ai pas encore été voir sur Qt Bug tracker.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut


    Je n'ai rien vu sur le bug tracker. Si c'est de même pour toi, alors je pense signaler le problème.

    À te lire.

    J
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

Discussions similaires

  1. [Flex4] Supprimer/Cacher les éléments des scrollbar d'un Scroller
    Par gere34 dans le forum Flex
    Réponses: 6
    Dernier message: 12/09/2012, 15h49
  2. Supprimer successivement les éléments d'une liste
    Par Frednight dans le forum Maple
    Réponses: 2
    Dernier message: 18/06/2012, 18h31
  3. Gui - Java App - ajouter, supprimer, réorganiser les éléments
    Par alibm dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 06/03/2011, 02h30
  4. JList Supprimer Tous les éléments
    Par Ho(c)ine. dans le forum Composants
    Réponses: 3
    Dernier message: 05/02/2011, 07h29
  5. Réponses: 15
    Dernier message: 02/02/2011, 09h56

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