QComboBox und setDuplicatesEnabled(False)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

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)
Zuletzt geändert von AngelusNoctis am Samstag 3. April 2010, 18:18, insgesamt 3-mal geändert.
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

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ß
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

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()
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).
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

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
lunar

Ein Buch ersetzt nie die offizielle Dokumentation einer Bibliothek.
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

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()
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

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!
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

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.
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)
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Naja, dann aktualisier ich halt weiterhin über den QPushButton...
Ist ja nur beim Formatierungs-Dialog.


Trotzdem danke an alle :)
Antworten