Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Biblio-SIG fait peau neuve !

#1 Thu 30 April 2026 10:56

AlexisSIG
Participant occasionnel
Date d'inscription: 17 Mar 2025
Messages: 11

QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,

J'ai un projet QGIS avec un ensemble de couches provenant d'une connexion PostgreSQL.
Je mets ce projet sur QField pour une prise de données naturaliste sur le terrain. La connexion avec la base se fait sans problème.

Je souhaite cependant, filtrer l'ensemble de mes couches selon un champ. J'ai donc créé une variable projet sur QGIS que je laisse vide. J'ai ensuite écrit un script QML (ci-dessous) permettant l'ouverture d'un popup à mon ouverture de mon projet sur QField et me permettant de renseigner une valeur pour cette variable et ainsi filtrer mes couches. (Le script présenté n'est fait que pour filtrer une seule couche, je l'adapterai pour les autres lorsque celui-ci fonctionnera). Les logs QField me permettent de voir que j'ai le bon nom de champ reconnu et le bon filtre renseigné lorsque je l'intègre.
Pour autant, ma couche affiche 0 entité. Je n'arrive pas à comprendre où mon script cesse de fonctionner correctement.

Code:

import QtQuick
import QtQuick.Controls
import org.qfield
import Theme

Item {
    Component.onCompleted: {
        codeetudeDialog.open();
    }

  QfDialog {
    id: codeetudeDialog
    parent: iface.mainWindow().contentItem

    width: 300
    height: 180
    x: (iface.mainWindow().width - width) / 2
    y: (iface.mainWindow().height - height) / 2
    title: "Saisissez un Code Etude"

    Column {
      id: columnLayout
      width: parent.width

      TextField {
        id: codeetudeField
        width: parent.width
        text: ""
      }
    }

    onAccepted: {
      const valeur = codeetudeField.text.trim();
      if (valeur === "") return;

      ExpressionContextUtils.setProjectVariable(qgisProject, "code_etude", valeur);
      let projectInfo = iface.findItemByObjectName("projectInfo");
      projectInfo.saveVariable("code_etude", valeur);

      const couches = qgisProject.mapLayersByName("Etude");
      if (couches.length === 0) return;
      const couche = couches[0];

      const valeurSafe = valeur.replace(/'/g, "''");
      couche.subsetString = '"Code_Etude" = \'' + valeurSafe + "'";

      // Remplace reload() + triggerRepaint() + mapCanvas().refresh()
      iface.reloadProject();
    }
  }
}

Hors ligne

 

#2 Thu 30 April 2026 12:53

Al3+
Participant actif
Lieu: Fécamp
Date d'inscription: 5 Sep 2005
Messages: 75

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,

N'y a-t-i pas une subtilité avec les ' et les " ?

Je vous propose :

Code:

couche.subsetString = '"Code_Etude" = \'' + valeurSafe + '\'';

au lieu de

Code:

couche.subsetString = '"Code_Etude" = \'' + valeurSafe + "'";

Hors ligne

 

#3 Thu 30 April 2026 13:13

AlexisSIG
Participant occasionnel
Date d'inscription: 17 Mar 2025
Messages: 11

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Je viens d'essayer la solution proposer mais rien ne change malheureusement

Hors ligne

 

#4 Thu 30 April 2026 21:19

fabriceg
Juste Inscrit !
Date d'inscription: 3 Mar 2025
Messages: 4

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,
Je ne suis pas familier avec le QML, en python j'aurais plutôt écrit

Code:

couche.setSubsetString('"Code_Etude" = \'' + valeurSafe + '\'')

Hors ligne

 

#5 Aujourd'hui 10:59

AlexisSIG
Participant occasionnel
Date d'inscription: 17 Mar 2025
Messages: 11

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Bonjour,
Malheureusement setSubsetString() n'est pas une fonction reconnu en QML

Hors ligne

 

#6 Aujourd'hui 17:42

Al3+
Participant actif
Lieu: Fécamp
Date d'inscription: 5 Sep 2005
Messages: 75

Re: QField : Filtrer couche PostgreSQL à partir d'une variable

Bonsoir AlexisSIG,

Je viens de tester ton script en le personnalisant bien évidemment. Tout est quasiment bon sauf que la boîte de dialogue se réouvre en boucle car tu appelles un "reloadproject" après avoir renseigné une valeur.

J'ai donc juste supprimé tes 2 dernières lignes :

// Remplace reload() + triggerRepaint() + mapCanvas().refresh()
      iface.reloadProject();


Et ça fonctionne, car ça applique bien le filtre sur la couche puis ça actualise la carte.
Je ne sais pas s'il y a d'autres conséquences car j'avoue que je découvre ce langage QML.

Merci de nous tenir au courant si c'est bon pour toi aussi avec cette modification.


Pour information, il existe également un script tout fait, avec une interface permettant de choisir la couche à filtrer, sur un champ à choisir et avec la valeur contenue en base de données. Le code est ici : https://github.com/woupss/qfield-filter … /tree/main

Dernière modification par Al3+ (Aujourd'hui 17:57)

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo