[PyKDE] KConfigSkeleton Blues
Paul Waldo
pwaldo at waldoware.com
Fri Dec 15 02:23:45 GMT 2006
Hi all,
I'm trying to make KConfigSkeleton easier for me to use. The thought of
having to convert all those nice python strings to QStrings and back
makes me cringe. So here is what I did: I created a wrapper class that
handles the conversion for me, as shown below:
from qt import *
class ConfigurationString(object):
def __init__(self, initialValue = ''):
self._qStringValue = QString(initialValue)
# From http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/205183
def value():
doc = "document me"
def fget(self):
return str(self._qStringValue)
def fset(self, value):
self._qStringValue = QString(str(value))
def fdel(self):
del self._qStringValue
return locals() # credit: David Niergarth
value = property(**value())
def main():
cs = ConfigurationString('initial')
print 'value is ' + cs.value
cs.value = 'end'
print 'value is ' + cs.value
print 'qstring is ' + str(cs._qStringValue)
if __name__ == '__main__':
main()
The idea here is that I use the "value" property whenever I want a
python string, but the underlying storage is a QString. Now, when I
create my KConfigSkeleton, I do this:
from qt import *
from kdecore import *
import signals
from ConfigurationString import ConfigurationString
class ConfigurationSchema(KConfigSkeleton):
# Configuration defaults
defaultTemplate = QString('default')
# Configuration item keys
ITEM_KEY_TEMPLATE = QString('template')
def __init__(self):
KConfigSkeleton.__init__(self)
self._matchInternalConfigToKdeConfig()
self.cs = ConfigurationString()
def _matchInternalConfigToKdeConfig(self):
self.setCurrentGroup(ConfigurationSchema.group)
self.addItemString(ConfigurationSchema.ITEM_KEY_TEMPLATE,
self.cs._qStringValue,
ConfigurationSchema.defaultTemplate)
def readConfig(self):
KConfigSkeleton.readConfig(self)
def writeConfig(self):
# We need to match the two configs again because the underlying
QStrings
# of the internal configs might have been modified
self._matchInternalConfigToKdeConfig()
KConfigSkeleton.writeConfig(self)
This all seems to work fine and dandy when I manually call
ConfigurationSchema.writeConfig, but when I change the configuration
data, it seems to automatically call KConfigSkeleton.writeConfig, which
bypasses my matchInternalConfigToKdeConfig. I see this on stdout when
just modifying a few of the configuration items:
kdecore (KConfigSkeleton): KConfigSkeleton::writeConfig()
kdecore (KConfigSkeleton): KConfigSkeleton::readConfig()
KCrash: crashing... crashRecursionCounter = 2
I assume that this is because the references to the QStrings in
KConfigSkeleton are not set up properly...
I am looking for help in either solving this issue or finding another
way to do KConfigSkeletons without having to do QString conversions all
over my code. Any help would be greatly appreciated!
Paul
More information about the PyQt
mailing list