QSettings Sınıfı Kullanımı

Posted on Pzt 13 Nisan 2015 in Python, PyQt

PyQt kullanarak bir uygulama geliştiriyor ve bu uygulamaya ayarlar ekliyecekseniz QtCore modülünde bulunanan QSettings sınıfını kullanabilirsiniz. QSettings sınıfı ile .ini-.conf uzantılı dosya formatlarında ayarlarınızı saklayabilirsiniz.

QSettings sınıfı ayar dosyanızı olağan şeklinde GNU/Linux sistemlerde /home/kullanıcı/.config/ dizini altında kaydeder. Verdiğiniz parametrelere göre uygulamanızın adıyla bir dizin oluşturulup ayar dosyanız bu dizinde saklanabilir.

#-*- coding:utf-8 -*-
from PyQt4.QtCore import *

ayarlar = QSettings("AyarDizini", u"AyarDosyasi")
ayarlar.setValue(u"PencereAyarlari/PencereBoyutu", QSize(300, 300))

print ayarlar.value(u"PencereAyarlari/PencereBoyutu").toSize()

PyQt4.QtCore.QSize(300, 300) # çıktı

Örneğimizde; ayar dosyasını .config/ içerisine AyarDizini adında dizin oluşturup AyarDosyasi.conf adında olacak şekilde ayarladık. QSettings modülünün setValue() methodu ile değer yazdırmadan ne dizin oluşur, ne de dosya. Örnekte ise bu methodu kullanarak ayar bilgilerimizi yazdırdık ve value() methodu ile bu değerimizi yazdırdık. Burada value() methodu bize QVariant nesnesi döndürür ve biz bunu toSize() methoduyla QSize nesnesine çeviririz. Yazdırdığınız değere göre dönüştürme yapmanız gerekir. Bunun için QVariant(Yeni sürümlerde PyQt otomatik Python veri dönüşümünü sağladığı için QVariant sınıfı çıkartılmıştır.) dökümanını inceliyebilirsiniz.

Bu örnekte dikkat edilecek nokta “PencereAyarlari/PencereBoyutu” kısmıdır. Bu string değer ile ayar dosyamızda PencereAyarlari adında bir grup oluşturmuş ve bu grubun bir üyesi olarak PencereBoyutu‘nu eklemiş olduk. PencereBoyutu’nun değerini ise QSize(300, 300) olarak atamış olduk. Bu kodun ayar dosyasındaki çıktısı ise şöyle olur:

[PencereAyarlari]
PencereBoyutu=@Size(300 300)

Eğer setValue() methodunu kullanırken bölü(/) karakteriyle gruplamayı istemiyorsanız beginGroup() methoduyla grup oluşturabilirsiniz. Devamında yazacağınız değerlerde sadece ayarın ismini ve değerini girerek grup üyesi ayarları tanımlayabilirsiniz. Gruba son vermek için ise endGroup() methodunu kullanabilirsiniz.

#-*- coding:utf-8 -*-
from PyQt4.QtCore import *

ayarlar = QSettings("AyarDizini", u"AyarDosyasi")
ayarlar.beginGroup("PencereAyarlari")
ayarlar.setValue("PencereBoyutu", QSize(300, 300))
ayarlar.endGroup()

print ayarlar.value(u"PencereAyarlari/PencereBoyutu").toSize()
# veya
ayarlar.beginGroup("PencereAyarlari")
print ayarlar.value(u"PencereAyarlari/PencereBoyutu").toSize()
ayarlar.endGroup()

PyQt4.QtCore.QSize(300, 300) # çıktı

Genelde setValue() ile değer tanımladığınızda ayar dosyaya yazılır ve okunmaya hazır hale getirilir. Ancak herhangi bir nedenden dolayı dosyaya yazma işlemi yapılmıyorsa(Hata oluşmadıysa) sync() methodunu kullanarak senkronizasyon işlemi yapabilirsiniz.

Bir ayarı silmek istiyorsanız value() methodunu kullandığınız mantıkla remove() methodunu kullanarak ayar silebilirsiniz.

ayarlar.remove("PencereAyarlari/PencereBoyutu")
# veya
ayarlar.beginGroup("PencereAyarlari")
ayarlar.remove("PencereBoyutu")
ayarlar.endGroup()

Windows’ta ise QSetting sınıfı ayarları regeditte tutar, ama deneyimime dayanarak regedit kaydının sorunlu olduğunu söyleyebilirim. Bu yüzden Windows için de *.ini dosyası kullanmak isteyebiliriz. O zaman QSettings nesnemizi tanımlarken şu şekilde yazmalıyız.

ayarlar =  QSettings("DosyaYolu\dosya.ini", QSettings.IniFormat)

QSettings’e verdiğimiz ilk parametre dosya yolunu, ikinci parametre ise ayar formatının nasıl olacağını belirtir. Burada QSettings.IniFormat ile bir *.ini dosyası formatında olmasını sağladık.

Ayar dosyasının nerede tutulduğunu fileName() methoduyla öğrenebilirsiniz. Bu bilgiyle başlangıç ayarlarını yazmak için dosyanın varlığını kontrol etmenize olanak tanımış olur…