Seite 1 von 1
QComboBox und setDuplicatesEnabled(False)
Verfasst: Mittwoch 31. März 2010, 18:41
von AngelusNoctis
Hi ich hab ein kleines Problem mit QComboBox und setDuplicatesEnabled und zwar folgendes....
Wenn ich auf den QPushBotton klicke wird mir getPartitions() ausgeführt, diese liest in /proc/partitions und fügt die Elemente der QComboBox hinzu.
Da ich keine doppelten Einträge wollte hab ich einfach mal setDuplicatesEnabled(False) gemacht, jedoch funktioniert dies nicht bzw bei jedem klick verdoppeln sich die Einträge.
Kann mir jemand helfen? oO
Code: Alles auswählen
def getPartitions(self):
self.partitionBox.setDuplicatesEnabled(False)
f = open('/proc/partitions' ,'r')
device_list = re.findall('(\w{2,})\n', f.read())[1:]
for device in device_list:
if not device.isalpha():
self.partitionBox.addItem(device)
f.close()
Code: Alles auswählen
self.connect(self.refreshPartition, QtCore.SIGNAL('clicked()'), self.getPartitions)
Verfasst: Mittwoch 31. März 2010, 21:00
von ichisich
duplicatesEnabled : bool
This property holds whether the user can enter duplicate items into the combobox.
Note that it is always possible to programmatically insert duplicate items into the combobox.
By default, this property is false (duplicates are not allowed).
Kann es sein das Du dich selber darum kümmern mußt, da du ja "programmatically" deine Inhalte erstellst ?
Statt der device_list bietet sich ein set() an da dort vorhandene Elemente nicht erneut aufgenommen werden.
Gruß
Verfasst: Mittwoch 31. März 2010, 21:57
von AngelusNoctis
ichisich hat geschrieben:duplicatesEnabled : bool
This property holds whether the user can enter duplicate items into the combobox.
Note that it is always possible to programmatically insert duplicate items into the combobox.
By default, this property is false (duplicates are not allowed).
Kann es sein das Du dich selber darum kümmern mußt, da du ja "programmatically" deine Inhalte erstellst ?
Statt der device_list bietet sich ein set() an da dort vorhandene Elemente nicht erneut aufgenommen werden.
Gruß
Stimmt
Seltsamer weise steht in meinem Qt 4 Buch von Galileo Press nichts drin von:
This setting only applies when the user want's to insert a text with pressing the return key. It does not affect methods like insertItem() and similar.
Naja mach ichs halt mit set().
Danke trotzdem
Edit: Habs jetzt mit clear() gelöst.
Code: Alles auswählen
def getPartitions(self):
self.partitionBox.clear()
f = open('/proc/partitions' ,'r')
device_list = re.findall('(\w{2,})\n', f.read())[1:]
device_list.sort()
for device in device_list:
if not device.isalpha():
self.partitionBox.addItem(device)
f.close()
Verfasst: Donnerstag 1. April 2010, 09:58
von lunar
@AngelusNoctis: Lies doch bitte die Dokumentation dieser Eigenschaft:
This property holds whether the user can enter duplicate items into the combobox.
Note that it is always possible to programmatically insert duplicate items into the combobox.
By default, this property is false (duplicates are not allowed).
Ansonsten empfiehlt es sich vielleicht, statt "set()" "QMap()" zu verwenden. Diese Klasse enthält ebenfalls keine Duplikate, ist aber immer sortiert, was für die Anzeige in einem Steuerelement empfehlenswert ist.
Ich persönlich würde außerdem eine eigene Modellklasse für diesen Zweck implementieren, und dann mit QFileSystemWatcher /proc/mounts überwachen. Dann aktualisiert sich die Liste der Partitionen "automatisch".
Und falls Dein Buch "Python - Das umfassende Handbuch" ist, dann lies dieses Buch bitte mit Vorsicht, denn dieses Buch ist nicht an allen Stellen von guter Qualität (siehe
http://bj.spline.de/python_openbook.html).
Verfasst: Donnerstag 1. April 2010, 21:02
von AngelusNoctis
lunar hat geschrieben:@AngelusNoctis: Lies doch bitte die Dokumentation dieser Eigenschaft:
This property holds whether the user can enter duplicate items into the combobox.
Note that it is always possible to programmatically insert duplicate items into the combobox.
By default, this property is false (duplicates are not allowed).
Ansonsten empfiehlt es sich vielleicht, statt "set()" "QMap()" zu verwenden. Diese Klasse enthält ebenfalls keine Duplikate, ist aber immer sortiert, was für die Anzeige in einem Steuerelement empfehlenswert ist.
Ich persönlich würde außerdem eine eigene Modellklasse für diesen Zweck implementieren, und dann mit QFileSystemWatcher /proc/mounts überwachen. Dann aktualisiert sich die Liste der Partitionen "automatisch".
Und falls Dein Buch "Python - Das umfassende Handbuch" ist, dann lies dieses Buch bitte mit Vorsicht, denn dieses Buch ist nicht an allen Stellen von guter Qualität (siehe
http://bj.spline.de/python_openbook.html).
Ich hatte eben die Beschreibung in meinem Buch "Qt4 GUI-Entwicklung mit C++" von Galileo Computing bzw Press nachgeschlagen und da stand nix davon, nur das eben keine Duplikate mehr erlaubt wären.
Siehe oben.
Das mit QFileSystemWatcher werd ich mir angucken..
Thx
Verfasst: Donnerstag 1. April 2010, 21:11
von lunar
Ein Buch ersetzt nie die offizielle Dokumentation einer Bibliothek.
Verfasst: Freitag 2. April 2010, 23:18
von AngelusNoctis
lunar hat geschrieben:Ein Buch ersetzt nie die offizielle Dokumentation einer Bibliothek.
Du ich hab mal ne frage und zwar...
Kannst du mir erklären wieso QFileSystemWatcher zwar bei einer normalen Datei z.B. test.txt in /home/username/ funktioniert aber bei Dateien in /proc nicht funktioniert?
Weder als User noch als root...
Bei der test.txt reicht das öffnen der Datei damit der FileSystemWatcher anspringt...
Bei der /proc/partitions tut sich garnix...
Ich kann den USB Stick so oft ich will ein/ausstöpsel damit /dev/sdf1 hinzugefügt/entfernt wird in /proc/partitions aber das lässt den FileSystemWatcher kalt oO
Code: Alles auswählen
self.fileWatch = QtCore.QFileSystemWatcher(self)
self.fileWatch.addPath('/proc/partitions')
self.connect(self.fileWatch, QtCore.SIGNAL('fileChanged(const QString &)'), self.getPartitions)
Code: Alles auswählen
def getPartitions(self):
print 'YES'
# self.partitionBox.clear()
# f = open('/proc/partitions' ,'r')
# device_list = re.findall('(\w{2,})\n', f.read())[1:]
# device_list.sort()
# for device in device_list:
# if not device.isalpha():
# self.partitionBox.addItem(device)
# f.close()
Verfasst: Samstag 3. April 2010, 09:21
von philistion
Ich würde auf HAL zugreifen, also ungefähr so:
Code: Alles auswählen
self.bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
self.hal_service = self.bus.get_service("org.freedesktop.Hal")
self.hal_manager = self.hal_service.get_object("/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager")
# gdl_changed will be invoked when the Global Device List is changed
# per the hal spec
self.bus.add_signal_receiver(self.gdl_changed,
"DeviceAdded",
"org.freedesktop.Hal.Manager",
"org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager")
Siehe:
http://lists.freedesktop.org/archives/h ... 01623.html
Ansonsten versuch es mal damit:
http://stackoverflow.com/questions/1618 ... ith-python
Aber per DBUS/HAL ist es definitiv eleganter!
Verfasst: Samstag 3. April 2010, 14:18
von AngelusNoctis
philistion hat geschrieben:Ich würde auf HAL zugreifen, also ungefähr so:
Code: Alles auswählen
self.bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
self.hal_service = self.bus.get_service("org.freedesktop.Hal")
self.hal_manager = self.hal_service.get_object("/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager")
# gdl_changed will be invoked when the Global Device List is changed
# per the hal spec
self.bus.add_signal_receiver(self.gdl_changed,
"DeviceAdded",
"org.freedesktop.Hal.Manager",
"org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager")
Siehe:
http://lists.freedesktop.org/archives/h ... 01623.html
Ansonsten versuch es mal damit:
http://stackoverflow.com/questions/1618 ... ith-python
Aber per DBUS/HAL ist es definitiv eleganter!
Genau das möcht ich nicht!
Kein HAL, kein Device-Kit und kein Solid!
Sonst wird der Code noch "fetter" vorallem da ich dann noch prüfen müsste ob die jeweilige Distrubtion nun HAL oder Device-Kit nutzt.
An KDE's Solid will ich mich auch nicht binden weil das ganze auch ohne kde-libs funzen soll.
Später müsste man dann noch den ganzen HAL/Device-Kit Code gegen udev-extra ersetzen.
Davon abgesehen ist der Weg über /proc/partitions einfacherer und es fällt weniger Code an.
Verfasst: Samstag 3. April 2010, 14:53
von lunar
@AngelusNoctis: Offenbar unterstützt procfs inotify nicht. Pech gehabt.
Eine Lösung über Hal und/oder DeviceKit-Discs ist nicht „fett“, sondern wahrscheinlich weniger komplex als ein Eigenbau. Das „Prüfen“ ist trivial, denn wenn der Dienst nicht läuft, gibt es beim Verbinden zum Dienst eine Ausnahme.
Die Alternative ist libudev oder ein Eigenbau über procfs und Polling, beides ist aber mit Sicherheit komplizierter.
@philistion: Dieses Beispiel ist nicht mehr aktuell, die API hat sich geändert (siehe
http://bitbucket.org/lunar/snippets/src ... signals.py)
Verfasst: Samstag 3. April 2010, 18:18
von AngelusNoctis
Naja, dann aktualisier ich halt weiterhin über den QPushButton...
Ist ja nur beim Formatierungs-Dialog.
Trotzdem danke an alle
