Drag and Drop Operationen einem Widget zuweisen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Da ich die GUI mittels uic.loadUi in das Programm einbinde, habe ich eine Fragen:

Wie weise ich folgende Funktionen einem Widget zu?

Code: Alles auswählen

    def dragEnterEvent(self, event):
        print 'dragEnter'
        
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        print "dragMove"
        if event.mimeData().hasUrls():
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(QtCore.SIGNAL("dropped"), links)
            print links
            self.ui.listWidget.addItems(links)
        else:
            event.ignore()
Explizit handelt es sich um self.ui.listWidget. Geladen wird es über:

Code: Alles auswählen

class MeinDialog(QtGui.QMainWindow):
    def __init__(self, parent=None):
        
        self.dateien = []
        QtGui.QMainWindow.__init__(self)
        # UI Datei und Signale einrichten
        self.ui = uic.loadUi("gui.ui", self)
zZ Funktioniert das Drag&Drop schon, wird aber auf das komplette GUI angewandt.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Du kannst prinzipiell die Funktionen des Widgets einfach mit den gewünschten Funktionen überschreiben.

Code: Alles auswählen

self.ui.listWidget.dragEnterEvent = self.custom_drag_enterevent

def custom_drag_enterevent(self, event):
    print "dragEnter"
Eher empfehlenswert wäre allerdings, ein eigenes Widget von QListWidget zu erben und dem die entsprechenden Funktionen zu geben. Um das im Designer verwenden zu können, müsstest du dann allerdings ein Plugin für dein Widget schreiben. Oder du platzierst in deiner UI einen Platzhalter mit dem Designer und ersetzt ihn code-seitig mit deinem eigenen Widget.
BlackJack

@lackschuh: Bei `uic.loadUi()` den Rückgabewert an ein Attribut zu binden *und* das zweite Argument zu übergeben macht keinen Sinn.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

BlackJack hat geschrieben:@lackschuh: Bei `uic.loadUi()` den Rückgabewert an ein Attribut zu binden *und* das zweite Argument zu übergeben macht keinen Sinn.
Idealerweise sei hinzugefügt, warum das keinen Sinn macht. :wink: Denn prinzipiell ist es ja nicht inkorrekt.

@lackschuh
Wenn du den zweiten Parameter (baseinstance) übergibst, wird dieser als Parent für deine UI verwendet. (natürlich vorausgesetzt der Parameter ist ein gültiges QWidget!)
Übergibst du also self mit, dann brauchst du den Rückgabewert von loadUi() nicht mehr in eine Variable schreiben. Du kannst alle Widgets deiner UI dann über self.widget_xyz ansprechen.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Liess ja lange auf eine Antwort warten :mrgreen: :mrgreen:
Das Tool ist eigentlich schon im Einsatz aber ich werde mir eure Tipps/Anregungen zu Herzen nehmen und es versuchen anzuwenden.

mfg
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

lackschuh hat geschrieben:Liess ja lange auf eine Antwort warten :mrgreen: :mrgreen: mfg
Jau, bin erst seit Kurzem hier im Forum unterwegs. Hätten aber auch viele Andere beantworten können...
Antworten