Partage
  • Partager sur Facebook
  • Partager sur Twitter

les index sur QListView

Sujet résolu
    22 février 2016 à 15:20:55

    Cher

    Je débute en python,  je parviens à recuperer mes données de la base des données postgressql et sont affichées dans un QListView sans problème , comme le QListView ne peut afficher qu'une seule colonne je ne peux donc afficher qu'un champ de ma table (Nom de la personne), mais je voudrais quand je choisi un element de la liste (le nom de la personne) que je soit en mesure de recupérer son ID(sa clé primaire), 

    Je sais pas si je suis claire mais je voudrais personnaliser les index de mon QListView et avoir à la place les ID(clé primaire) de ma table

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2016 à 22:26:25

      Je ne peux pas tester, mais il me semble que tu puisses rajouter salement un attribut à ton item. A vérifier cependant.
      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2016 à 8:21:43

        Merci bien pour cette réaction, mais je veux bien savoir à quel niveau on ajoute cet attribut,

        voici le code qui rempli mon QListView

         def re(self):
                model = QStandardItemModel(self.lstLisPri)
                cur = self.conn.cursor()
                self.conn.set_isolation_level(0)
        
                try:
                    cur.execute("SELECT service,codeservice FROM service")
                except psycopg2.ProgrammingError as e:
                    print e
                project =cur.fetchall()
                for i in project:
        
                    # Create an item with a caption
                    item = QStandardItem(i[0])
                    
                    # Add a checkbox to it
                    item.setCheckable(True)
                    # Add the item to the model
                    model.appendRow(item)
                self.lstLisPri.setModel(model)
        

        -
        Edité par kayuyu 23 février 2016 à 8:22:31

        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2016 à 10:13:24

          Comme tu as ton propre modèle, tu peux faire un truc comme ça :

          import sys
          from PyQt4 import QtGui, QtCore
          Qt = QtCore.Qt
          
          class ListModelView(QtCore.QAbstractListModel) :
          	def __init__(self, lst, parent=None) :
          		QtCore.QAbstractListModel.__init__(self, parent)
          		self._data = lst
          
          	def rowCount(self, parent) :
          		return len(self._data)
          
          	def data(self, index, role) :
          		if role == Qt.DisplayRole and index.isValid() :
          			return QtCore.QVariant(str(self._data[index.row()].get("name")))
          		return QtCore.QVariant()
          
          	def get_id(self, index) :
          		return self._data[index].get("Id")
          
          class ApplicationWindow(QtGui.QMainWindow) :
          	def __init__(self) :
          		QtGui.QMainWindow.__init__(self)
          		self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
          		self.initUI()
          		self.initList()
          		self.setCentralWidget(self.main_widget)
          
          	def initUI(self) :
          		self.main_widget = QtGui.QWidget(self)
          		self.layout = QtGui.QVBoxLayout(self.main_widget)
          		self.qlist = QtGui.QListView()
          		self.qlist.doubleClicked.connect(self.item_click)
          		self.layout.addWidget(self.qlist)
          
          	def initList(self) :
          		liste_test = [{"name": "Bob", "Id": 1}, {"name": "Alfred", "Id": 2}]
          		self.model = ListModelView(liste_test)
          		self.qlist.setModel(self.model)
          		self.qlist.show()
          
          	def item_click(self) :
          		indexs = [it.row() for it in self.qlist.selectedIndexes()]
          		print [self.model.get_id(idx) for idx in indexs]
          
          def main() :
          	qApp = QtGui.QApplication(sys.argv)
          	qApp.setStyle('cleanlooks')
          	aw = ApplicationWindow()
          	aw.show()
          	sys.exit(qApp.exec_())
          
          if __name__ == '__main__':
          	main()



          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2016 à 16:08:24

            Merci bien pour cette reaction, le code marche super bien mais quand je l'integre à QGIS pour mon extension que je suis crée, il me génére ce message d'erreur

            TypeError: PyQt4.QtCore.QVariant represents a mapped type and cannot be instantiated


            Je comprends que l'erreur est situé au niveau de ma fonction data qui affiche les données

            • Partager sur Facebook
            • Partager sur Twitter
              23 février 2016 à 16:28:54

              Difficile de t'aider avec uniquement l'erreur. Tu devrais regarder cette page, ça ressemble à ton problème.
              • Partager sur Facebook
              • Partager sur Twitter
                24 février 2016 à 9:01:53

                Salut

                Merci Jevani pour ton appui voici le code

                import os
                from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, SIGNAL, QModelIndex
                from PyQt4 import QtGui, uic
                from PyQt4.QtGui import QTreeView, QStandardItemModel, QStandardItem, QAbstractItemView, QStringListModel, QMessageBox
                from PyQt4.QtSql import *
                from personalisationIndex import ListModelView
                import psycopg2
                
                FORM_CLASS_ENQUETE, _ = uic.loadUiType(os.path.join(
                    os.path.dirname(__file__), 'ui_enquete1.ui'))
                
                
                class Enquete(QtGui.QWizard, FORM_CLASS_ENQUETE):
                    def __init__(self, parent=None, menage=0):
                        """Constructor."""
                        super(Enquete, self).__init__(parent)
                        # Set up the user interface from Designer.
                        # After setupUI you can access any designer object by doing
                        # self.<objectname>, and you can use autoconnect slots - see
                        # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
                        # #widgets-and-dialogs-with-auto-connect
                        self.conn = psycopg2.connect("dbname='stdmluhonga' user='postgres' host='localhost' password='BENOITE' port='5433'")
                
                        self.setupUi(self)
                        #QMessageBox.information(self,"element de la selection", menage)
                        self.re()
                        self.remplirAnnexe()
                        self.remplirMoyenDeSecurisation()
                        """bouton deplacer priorite"""
                        self.connect(self.btnDeplacer,SIGNAL("clicked()"),self.re)
                        self.lstLisPri.setSelectionMode(QAbstractItemView.ExtendedSelection)

                FICHIER: personalisationIndex

                import sys
                from PyQt4 import QtGui, QtCore
                from PyQt4 import QtCore, QtGui
                Qt = QtCore.Qt
                
                class ListModelView(QtCore.QAbstractListModel) :
                    def __init__(self, lst, parent=None) :
                        QtCore.QAbstractListModel.__init__(self, parent)
                        self._data = lst
                
                    def rowCount(self, parent) :
                        return len(self._data)
                
                    def data(self, index, role) :
                        if not index.isValid() :
                            return None #With sip v 1.0 used to be QVariant()
                        elif role != Qt.DisplayRole :
                            return None
                
                    def get_id(self, index) :
                        return self._data[index].get("Id")
                




                • Partager sur Facebook
                • Partager sur Twitter
                  24 février 2016 à 11:19:59

                  J'imagine que ça ne fonctionne toujours pas. De plus ta fonction data ne semble pas bonne, tu renvoies toujours None. Tu as toujours le même message d'erreur ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 février 2016 à 11:59:55

                    Salut

                    Merci bien Jevani

                    Je crois ca marche, Il me suffisait juste de réecrire ma fonction data qui me renvoyait un NONE, comme ceci

                    def data(self, index, role) :
                            if role == QtCore.Qt.DisplayRole and index.isValid() :
                                return str(self._data[index.row()].get("name").encode('utf8'))



                    par contre à la place de ma liste

                     liste_test = [{"name": "" + i[0] , "Id": ""+ str(i[1])} 

                    je voudrais personnaliser et y lire une table de ma base des données

                    voici le code complét

                     def re(self):
                            self.modeli = QStandardItemModel(self.lstLisPri)
                            cur = self.conn.cursor()
                            self.conn.set_isolation_level(0)
                    
                            try:
                                cur.execute("SELECT service,codeservice FROM service")
                            except psycopg2.ProgrammingError as e:
                                print e
                            project =cur.fetchall()
                    
                            for i in project:
                                
                                liste_test = [{"name": "" + i[0] , "Id": ""+ str(i[1])}]
                    
                                self.model = ListModelView(liste_test)
                                self.lstLisPri.setModel(self.model)
                            

                    Ca ne me renvoie que la derniere ligne de ma table, quelqu'un pour m'aider à afficher toutes les données de ma table

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 février 2016 à 15:07:23

                      Tu veux dire que tu veux un tableau ? Essaye d'être plus clair dans tes phrases, j'ai du mal à déchiffrer là.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 février 2016 à 15:56:36

                        Oui, Je veux un tableau mais qui est fait dynamiquement sur base des données de ma base des données
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 février 2016 à 16:34:50

                          Alors tu appliques la même méthode réalisée pour QAbstractListModel avec un QAbstractTableModel sur une QTable.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 février 2016 à 16:59:44

                            Thanks, S'il vous plait je peux avoir un code qui illustre ca?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 février 2016 à 10:37:43

                              Cher Jevani, j'ai parcouru la documentation sur le QAbstractTableModel, je pense que c'est pas qu'en heritant seulement de mon QAbstractListModel ceci ceci va resoudre mon problème parceque je ne compte que remplir une liste simple, je bataille et c'est bon ca marche, voici mon code

                              class ListModelView(QtCore.QAbstractListModel) :
                                  def __init__(self, lst, parent=None) :
                                      QtCore.QAbstractListModel.__init__(self, parent)
                                      self._data = lst
                              
                                  def rowCount(self, parent) :
                                      return len(self._data)
                              
                                  def data(self, index, role) :
                                      if role == QtCore.Qt.DisplayRole and index.isValid() :
                                          return str(self._data[index.row()].get("name"))
                              
                                      #return QtCore.QVariant()
                              
                                  def get_id(self, index) :
                                      return self._data[index].get("Id")
                              import os
                              from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, SIGNAL, QModelIndex
                              from PyQt4.QtGui import QMessageBox
                              from PyQt4 import QtGui, uic
                              from PyQt4.QtGui import QTreeView, QStandardItemModel, QStandardItem, QAbstractItemView, QStringListModel
                              from PyQt4.QtSql import *
                              from personalisationIndex import ListModelView
                              import psycopg2
                              
                              FORM_CLASS_ENQUETE, _ = uic.loadUiType(os.path.join(
                                  os.path.dirname(__file__), 'ui_enquete1.ui'))
                              
                              
                              class Enquete(QtGui.QWizard, FORM_CLASS_ENQUETE):
                                  def __init__(self, parent=None, menage=0):
                                      """Constructor."""
                                      super(Enquete, self).__init__(parent)
                                      # Set up the user interface from Designer.
                                      # After setupUI you can access any designer object by doing
                                      # self.<objectname>, and you can use autoconnect slots - see
                                      # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
                                      # #widgets-and-dialogs-with-auto-connect
                                      self.conn = psycopg2.connect("dbname='stdmluhonga' user='postgres' host='localhost' password='BENOITE' port='5433'")
                              
                                      self.setupUi(self)
                                      #QMessageBox.information(self,"element de la selection", menage)
                                      self.re()
                                      self.remplirAnnexe()
                                      self.remplirMoyenDeSecurisation()
                                      """bouton deplacer priorite"""
                                      self.connect(self.btnDeplacer,SIGNAL("clicked()"),self.item_click)
                                      self.lstLisPri.setSelectionMode(QAbstractItemView.ExtendedSelection)
                              
                              
                              
                                  
                                 
                              
                              
                                  def re(self):
                              
                                     
                                      cur = self.conn.cursor()
                                      self.conn.set_isolation_level(0)
                              
                                      try:
                                          cur.execute("SELECT service,codeservice FROM service")
                                      except psycopg2.ProgrammingError as e:
                                          print e
                                      project =cur.fetchall()
                                      nombre=cur.rowcount
                              
                                      liste=[]
                              
                              
                                      for i in project:
                                       liste.append({"name": '' + str(i[0].encode('utf8')),"Id": '' + str(i[1]) })
                                      self.model = ListModelView(liste)
                              
                                      self.lstLisPri.setModel(self.model)

                              Je voudrais savoir comment rendre les CHACKABLE de la liste true, Merci encore pour ton assistance


                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 février 2016 à 11:00:24

                                Je ne comprends plus rien et franchement j'ai envie d'abandonner. Certaines de tes phrases n'ont aucun sens et pour le peu que je comprenne, tu te contredis avec tes messages précédents. Tu veux un tableau ou une liste à la fin ? Et sérieusement, fais des phrases complètes qui ont un sens, relis toi, fais un effort. Le minimum à faire quand on demande de l'aide, c'est de chercher d'abord une solution à son problème (et pas que 1 minute) et de formuler correctement sa question. Ce sera avec plaisir que je t'aiderai par la suite si tu respectes ça.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 février 2016 à 11:13:06

                                  Merci bien Jevanni 

                                  Je veux essayer d'etre plus claire, Je veux plutot remplir une liste (QListView) et non pas un tableau, j'y suis parvenu grace à ton aide(voir le code source sur mon précédent post), je voudrais cependant appliquer des cases à cocher (CHACKABLE=true) à ma liste des données. pour l'instant ma liste affiche seulement les données de ma base des données.

                                  Je pense avoir été plus claire.

                                  Merci encore de ton aide

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    25 février 2016 à 13:08:33

                                    import sys
                                    from PyQt4 import QtGui, QtCore
                                    Qt = QtCore.Qt
                                    
                                    class ListModelView(QtCore.QAbstractListModel) :
                                    	def __init__(self, lst, parent=None) :
                                    		QtCore.QAbstractListModel.__init__(self, parent)
                                    		self._data = lst
                                    		self._ele_state = {idx : False for idx, _ in enumerate(lst)}
                                    
                                    	def rowCount(self, parent) :
                                    		return len(self._data)
                                    
                                    	def data(self, index, role) :
                                    		if role == Qt.DisplayRole and index.isValid() :
                                    			return QtCore.QVariant(str(self._data[index.row()].get("name")))
                                    
                                    		if role == Qt.CheckStateRole :
                                    			if self._ele_state[index.row()] :
                                    				return QtCore.QVariant(QtCore.Qt.Checked)
                                    			else :
                                    				return QtCore.QVariant(QtCore.Qt.Unchecked)
                                    
                                    		return QtCore.QVariant()
                                    
                                    	def change_state(self, rows) :
                                    		print rows
                                    		for row in rows :
                                    			if self._ele_state[row] :
                                    				self._ele_state[row] = False
                                    			else :
                                    				self._ele_state[row] = True
                                    
                                    	def setData(self,index,value,role=QtCore.Qt.EditRole):
                                    		if index.isValid():
                                    			if value.toInt()[0] != 0 :
                                    				self._ele_state[index.row()] = True
                                    			else :
                                    				self._ele_state[index.row()] = False
                                    			return True
                                    		return False
                                    
                                    	def flags(self, index):
                                    		return  Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
                                    
                                    	def get_id(self, index) :
                                    		return self._data[index].get("Id")
                                    
                                    class ApplicationWindow(QtGui.QMainWindow) :
                                    	def __init__(self) :
                                    		QtGui.QMainWindow.__init__(self)
                                    		self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
                                    		self.initUI()
                                    		self.initList()
                                    		self.setCentralWidget(self.main_widget)
                                    
                                    	def initUI(self) :
                                    		self.main_widget = QtGui.QWidget(self)
                                    		self.layout = QtGui.QVBoxLayout(self.main_widget)
                                    		self.qlist = QtGui.QListView()
                                    		self.qlist.doubleClicked.connect(self.item_click)
                                    		self.layout.addWidget(self.qlist)
                                    
                                    	def initList(self) :
                                    		liste_test = [{"name": "Bob", "Id": 1}, {"name": "Alfred", "Id": 2}]
                                    		self.model = ListModelView(liste_test)
                                    		self.qlist.setModel(self.model)
                                    		self.qlist.show()
                                    
                                    	def item_click(self) :
                                    		indexs = [it.row() for it in self.qlist.selectedIndexes()]
                                    		print [self.model.get_id(idx) for idx in indexs]
                                    
                                    def main() :
                                    	qApp = QtGui.QApplication(sys.argv)
                                    	qApp.setStyle('cleanlooks')
                                    	aw = ApplicationWindow()
                                    	aw.show()
                                    	sys.exit(qApp.exec_())
                                    
                                    if __name__ == '__main__':
                                    	main()
                                    

                                    Un exemple de comment faire.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    les index sur QListView

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown