banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 03 February 2015 10:17

nora 27
Participant actif
Date d'inscription: 15 Jul 2014
Messages: 59

QGIS & python : l'approche MVC et shapefile

bonjour à tous

je travaille sur le développement d'une GUI, de telle façon que je peux afficher au sein de cette interface une table et un fichier de forme proviennent d'une BD postgresql. (je lance le code à partir qgis 2.4)

j'ai réussi à faire la partie de la table par le code suivant:

Code:

class Table:
    def __init__(self):
 
        self.createConnection()
        self.model=QtSql.QSqlTableModel()
        self.initialiseModel(self.model)
 
    def initialiseModel(self,model):
 
        # pour afficher une table
 
        self.model.setTable("com")
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnRowChange)
        self.model.setSort(0,QtCore.Qt.SortOrder(0))
        self.model.select()
        return self.model
 
 
    def createConnection(self):
 
        self.con1 = psycopg.connect('host=localhost port=5432 dbname=stat user=postgres password=admin')
        return self.con1
tableView = QtGui.QTableView()
table=Table()
tableView.setModel(table.model)
tableView.show()

ma question est : comment je peux faire ça avec shapefile? quelle modèle et vue que je pourrai les utiliser?

merci beaucoup pour votre orientation

Hors ligne

 

#2 Tue 03 February 2015 11:18

gvellut
Participant actif
Lieu: Annecy
Date d'inscription: 13 Apr 2006
Messages: 112
Site web

Re: QGIS & python : l'approche MVC et shapefile

Avec QGIS, tu peux utiliser QgsVectorLayer (avec le driver OGR) pour lire les donnéees attributaires (et géométries) d'un shapefile:

vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name", "ogr")

Ensuite tu peux parcourir les données via getFeatures.

Regarde le cookbook:
http://docs.qgis.org/testing/en/docs/py … layer.html
http://docs.qgis.org/testing/en/docs/py … ector.html

Pour ton cas en particulier, je n'ai pas testé mais être que tu peux utiliser la classe QgsAttributeTableModel  pour obtenir un QAbstractTableModel pour la couche (comme ton table.model dans ton code) et l'utiliser avec QTableView directement. Ou bien tu peux aussi utiliser QgsAttributeTableView directement (c'est une sous-classe de QTableView). Tu peux aussi regarder comment l'affichage de la table attributaire est implémentée dans le code source de QGIS.

(comme les connections à PostgreSQL sont aussi implémentées avec QgsVectorLayer dans QGIS, tu devrais pouvoir utiliser le même code que ce soit un shapefile ou une connection PostgreSQL).

Dernière modification par gvellut (Tue 03 February 2015 11:23)

Hors ligne

 

#3 Thu 12 February 2015 09:43

nora 27
Participant actif
Date d'inscription: 15 Jul 2014
Messages: 59

Re: QGIS & python : l'approche MVC et shapefile

bonjour gvellut

j'ai essayé avec le code ci-dessous, mais j'ai rencontré une erreur:

code :

Code:

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui, QtSql,QtSvg
import psycopg2 as psycopg
import sys
from qgis.core import *
from qgis.gui import *

#try:
##con1 = psycopg.connect('host=localhost port=5432 dbname=stat user=postgres password=admin')
#except:
#    print "I am unable to connect to the database"


 
class Table:
    def __init__(self):
 
        self.createConnection()
        self.model=QgsAttributeTableModel()
        self.initialiseModel(self.model)
 
    def initialiseModel(self,model):
        
       
        
        uri = QgsDataSourceURI()
        uri.setConnection("localhost", "5432", "stat", "postgres", "admin")
        uri.setDataSource("public", "com", "the_geom", ' ',"gid")
        uri.uri()
        layer=QgsVectorLayer(uri.uri(), "allcountries", "postgres")
        self.model.getFeatures(layer)
        self.model.select()
        return self.model
           

    def createConnection(self):
        
        self.con1 = psycopg.connect('host=localhost port=5432 dbname=stat user=postgres password=admin')
        return self.con1

    
    
tableView =QgsAttributeTableView()
table=Table()
tableView.setModel(table.model)
tableView.show()

erreur: self.model=QgsAttributeTableModel()
TypeError: QgsAttributeTableModel(QgsVectorLayerCache, QObject parent=None): not enough arguments

comment je peux résoudre cet erreur?

merci

Hors ligne

 

Pied de page des forums

Powered by FluxBB