Hi Trolls,

recently, I stumbled across a strange Qt behaviour:
when supplying an absolute config path with QSettings, Qt seems to miss
subkey lists, but lists simple entries. Omiting the leading slash corrects
this behaviour.

See supplied source: test.cpp, test.py.

Also note, that when renaming keys/subkey on subsequent calls, one would 
expect to preserve former entries. This isn't true, but maybe this is due 
to the simplicity of the test.

This happens at least with Qt 3.0.5 from SuSE 8.1.

Regards,
Hans-Peter

On Sunday 10 November 2002 12:53, Phil Thompson wrote:
> On Saturday 09 November 2002 12:42 pm, Hans-Peter Jansen wrote:
> > Hi Phil et al.,
> >
> > while adopting QSettings for my hand rolled config stuff, I stumbled
> > over the QSettings.subkeyList() not working as expected:
> >
> > Qt doc says, entryList return all entries, which are not keys, while
> > subkeyList return all keys. At least in my tests under X11/linux,
> > subkeyList always return an empty list, but OTOH, they find their way
> > into the config file ($HOME/.qt/testrc in this case).
>
> In my testing subkeyList() is returning a list containing only "test". A
> C++ version does the same thing. I don't know whether it is a bug or a
> misunderstanding - but I don't think it is a PyQt problem.
>
> Phil
/*
 2002/11/10 test.cpp: qt settings glitch by Hans-Peter Jansen <[EMAIL PROTECTED]>
 */

#include <qstring.h>
#include <qsettings.h>

#define COMPANY "/whatever"
#define PROGRAM "/test"

int main( int argc, char **argv )
{
    QString p = PROGRAM;
    if (argc == 1) qDebug("call as './test test' to see it working...");
    if (argc >= 2 && argv[1]) p = argv[1];

    QSettings qs;
    qs.insertSearchPath(QSettings::Windows, COMPANY);
    qs.writeEntry(p + "/value", "ok");
    if (p[0] != '/') {
        qs.writeEntry(p + "/subkey/value", "ok");
    } else {
        qs.writeEntry(p + "/subkey/value", "not ok");
    }

    QString k, sk, v;
    qDebug("list entries: " + p);
    QStringList keys = qs.entryList(p);
    QStringList::Iterator it = keys.begin();
    while (it != keys.end()) {
        k = QString("%1/%2").arg(p).arg(*it);
        v = qs.readEntry(k);
        qDebug(k + ": " + v);
        ++it;
    }

    qDebug("list subkeys: " + p);
    keys = qs.subkeyList(p);
    it = keys.begin();
    if (keys.empty())
        qDebug("BUG: no subkeys 8(");
    else while (it != keys.end()) {
        sk = QString("%1/%2").arg(p).arg(*it);
        qDebug("list entry: " + sk);
        QStringList skeys = qs.entryList(sk);
        QStringList::Iterator sit = skeys.begin();
        while (sit != skeys.end()) {
            k = QString("%1/%2/%3").arg(p).arg(*it).arg(*sit);
            v = qs.readEntry(k);
            qDebug(k + ": " + v);
            ++sit;
        }
        ++it;
    }
}

/*
 gcc -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -lqt-mt -o test test.cpp

 vim:set et:ts=4:sw=4:
 */
#!/usr/bin/env python

import sys
from qt import *

program = 'test'
company = 'whatever'

path = "/%s" % (program)
if len(sys.argv) == 1:
    print "call as './test test' to see it working..."
if len(sys.argv) >= 2 and sys.argv[1]:
    path = sys.argv[1]

qs = QSettings()
qs.insertSearchPath(QSettings.Windows, "/%s" % company)
qs.writeEntry("%s/value" % path, "ok")
if path[0] != '/':
    qs.writeEntry("%s/subkey/value" % path, "ok")
else:
    qs.writeEntry("%s/subkey/value" % path, "not ok")

print "list entries:", path
for k in qs.entryList(path):
    print "%s: %s" % (k, qs.readEntry("%s/%s" % (path, k))[0])

print "list subkeys:", path
skl = qs.subkeyList("%s" % path)
if not skl:
    print "BUG: no subkeys 8("
else:
    for k in qs.subkeyList("%s" % path):
        for sk in qs.entryList("%s/%s" % (path, k)):
                print "%s/%s: %s" % (k, sk, qs.readEntry("%s/%s/%s" % (path, k, sk))[0])

Reply via email to