QField macro python

Bonjour à tous,

J’ai créer un projet QGIS avec une macro python qui permet de filtrer les données affichées selon une étude à préciser à l’ouverture du projet.

Je voulais savoir s’il existait une extension QField pour que cette macro fonctionne également l’application, ou s’il existe une solution alternative pour arriver à la même finalité.

QField ne supporte pas les macros python. Vous pouvez arriver a une alternative en utilisant des plugins de projets.

Pour plus de documentation sur les plugins QField, regardez se site: https://api.qfield.org/

J’ai essayé de créer un plugin project en QML pour afficher une boîte de dialogue à l’ouverture du projet sur QField, y insérer un Code et que celui-ci devienne une variable de filtre préalablement créer sur QGIS mais cela ne fonctionne pas

Auriez-vous une idée de la manière dont je pourrais m’y prendre.

Sachant que mes couches sont des couches provenant d’une connexion PostgreSQL

J’ai bien trouvé ce sujet : Edit QField Variables on project open as example plugin · Issue #1 · opengisch/qfield-template-plugin · GitHub

Mais je n’arrive pas à comprendre comment cela fonctionne alors que cela semble répondre à mon problème

@AROUX-GIS , avez-vous vu ceci: Code Snippets - QField API Documentation ?

@Mathieu_Pellerin Effectivement ça m’a permis de bien faire afficher mon popup pour demander une variable et l’intégrer en tant que variable de projet. Cependant, je me retrouve coincé à nouveau car je souhaite utiliser cette variable comme filtre sur diverse couches, mais il s’agit de couche postgreSQL, je ne peux donc pas simplement faire “Nom_du_Champ” = @variable dans mon expression de filtre sur QGIS.

Auriez-vous une piste à ce sujet ?

Tu peux faire le filtre quand le projet ouvre sur QField, qque chose come ca:


const valeur = ExpressionContextUtils.projectVariables(qgisProject)["ma_variable"];
qgisProject.mapLayersByName("ma_couche_pg")[0].subsetString = "mon_champ = '" + valeur + "'";

Merci pour cette piste, je vais me pencher dessus

Je me retrouve avec un script QML comme ça :

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: {
  ExpressionContextUtils.setProjectVariable(qgisProject, "code_etude", codeetudeField.text);
  let projectInfo = iface.findItemByObjectName("projectInfo");
  projectInfo.saveVariable("code_etude", codeetudeField.text);

  const valeur = ExpressionContextUtils.projectVariables(qgisProject)["code_etude"];
  console.error("Valeur saisie = [" + valeur + "]");
  
  const couches = qgisProject.mapLayersByName("Etude");
  console.error("NB couches = " + couches.length);

  const couche = couches[0];
  couche.subsetString = "\"Code_Etude\" = '" + valeur + "'";
  console.error("Filtre = " + couche.subsetString);
  
  couche.reload();
  couche.triggerRepaint();
  
  iface.mapCanvas().refresh();
}

}
}

Lorsque je regarde dans les logs de l’appli, la bonne couche est utilisée pour filtrer, et le bon filtre est renseigné sur le bon champ.
Pour autant, la couche filtrée n’affiche aucune entité. Cela reste identique si je met un filtre en brut dans le QML, ou si je laisse un filtre vide.

Un diagnostic possible serait que QField ne charge pas correctement la couche après l’application du filtre malgré le couche.reload()
Mais je n’en suis pas sur et je ne comprend pas ce qui pourrait causer cela.