<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hi Stefan,<br>
<br>
I had some spare time on the Sunday evening train. So I have just
added this possibility to the ValueRelation widget. You can now
choose the option "Use Completer" there.<br>
The query is still run every time the form is opened at the moment.
There is actually a caching mechanism for the value relation widget
prepared, so it should be possible to make use of that and
initialize the cache only once.<br>
But that will have to wait until I have some spare time again or one
may speed up the process by funding this or tackling the issue if
coding skills are available (for the last option, please get in
touch first, there are a couple of different approaches to doing
this),<br>
<br>
Testing is appreciated.<br>
Matthias<br>
<br>
<div class="moz-cite-prefix">On 03/28/2015 08:32 PM, Blumentrath,
Stefan wrote:<br>
</div>
<blockquote
cite="mid:f3dff30863d74f67bcde5e5ecdd2ba59@NINSRV23.nina.no"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"Courier New\,courier";
panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:1784958659;
mso-list-type:hybrid;
mso-list-template-ids:874516228 68419601 68419609 68419611 68419599 68419609 68419611 68419599 68419609 68419611;}
@list l0:level1
{mso-level-text:"%1\)";
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level2
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level3
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level4
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level5
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level6
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level7
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level8
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level9
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Dear all,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Thanks to Nathan`s
excellent example here:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><a
moz-do-not-send="true"
href="http://nathanw.net/2011/09/05/qgis-tips-custom-feature-forms-with-python-logic/">http://nathanw.net/2011/09/05/qgis-tips-custom-feature-forms-with-python-logic/</a><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I managed to implement a
simple QCompleter for a LineEdit in my form where the
completer items are being fetched from DB (see init function
code at the end of my mail).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">This is very, very
promising stuff which comes in quite handy for entering
species names (from an official list of (thousands of)
species names in my case)!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Yet there are two things
I am struggling with:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">1) Would it be possible
to use this QCompleter solution to an autogenerated form?
The auto generated forms are more than good enough for most
of my use-cases. When I tried the Init function on an
autogenerated form I got “</span><span
style="font-family:"Courier New,courier",serif"
lang="EN-US">NameError: global name 'TextEdit' is not
defined”… Any ideas how to fix that?</span><span
lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2) It seems to me that
the query - which is used to fill the QCompleter - is
executed each time the form is opened. Would it be possible
to avoid this, I mean that the query is only run once (e.g.
when I open the project)? I hoped this could speed up the
start of the form (even if the query gets cached in
PostgreSQL)…<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Many thanks in advance
for helping.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Kind regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Stefan<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">P.S.: Next thing I will
have to do is understand SIGNALS and SLOTS so I can adjust
the completer content depending on other data entered in the
form (e.g. filter species by kingdom or known occurrence in
a country (here Norway)) …<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">P.P.S.: My form_init.py
looks like this:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">from PyQt4.QtCore import
*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">from PyQt4.QtGui import
*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">from PyQt4.QtSql import
*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">import psycopg2<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN">nameField = None<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN">myDialog = None<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN">def
formOpen(dialog,layerid,featureid):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN"> global myDialog<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN"> myDialog = dialog<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN"> global nameField<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="NO-NYN"> </span><span
lang="EN-US">nameField =
dialog.findChild(QLineEdit,"latinsk_navn")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> #Initiate completer<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> completer =
QCompleter()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">
nameField.setCompleter(completer)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> #Fetch data from DB
to fill completer<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> conn =
psycopg2.connect("dbname='MYDB' user='MYUSERNAME'
host='MYHOST' password='MYPASSWD'")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> cur = conn.cursor()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">
cur.execute("""SELECT scientificname FROM kls.l_artsliste
WHERE finnesinorge = 'Ja'""")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> completition_items =
[]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> for row in
cur.fetchall():<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">
completition_items.append(row[0])<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> #Add data
to Qt Model / QCompleter<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> model =
QStringListModel()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">
model.setStringList(completition_items)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">
completer.setModel(model)<o:p></o:p></span></p>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
Qgis-user mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Qgis-user@lists.osgeo.org">Qgis-user@lists.osgeo.org</a>
<a class="moz-txt-link-freetext" href="http://lists.osgeo.org/mailman/listinfo/qgis-user">http://lists.osgeo.org/mailman/listinfo/qgis-user</a></pre>
</blockquote>
<br>
</body>
</html>