2016-08-08 15 views
0

Was ich tue,/Was ich habe, so weit:Wie überschreiben Sie das Ereignis (dropEvent) eines Widgets in der dynamischen Benutzeroberfläche von PyQt?

Ich bin mit Qt-Designer PyQt .ui-Datei, die ich lade ich in meinem Python-Skript erstellen QUiLoader verwendet, die mir Zugang zu den Widgets/Komponenten gibt wie:

self.ui.tree_widget_of_items (which is a QTreeWidget created in Qt-designer) 

ich bin die Werte von Widgets lesen und schreiben kann, und ich bin in der Lage, das Signal auf TreeWidget wie folgt zu verwenden:

self.ui.tree_widget_of_items.itemSelectionChanged.connect(self.myFunction) 

Was ich bin versuchen zu tun ?

  • Ich möchte dropEvent von treeWidget in meinem Python-Skript

außer Kraft zu setzen, was ich habe versucht, aber hat nicht funktioniert:

self.ui.tree_widget_of_items.dropEvent = self.drop_action 

def drop_action(self,e): 
    print "drop action" 

ich versucht habe, die Zuweisung eines meiner eigenen Funktion zu dropEvent von TreeWidget, aber es wird nicht ausgelöst, wenn ich ein Element auf TreeWidget lösche.

habe ich auch versucht:

self.ui.tree_widget_of_items.dragEnterEvent = self.drop_action 

Ich stellte sicher, dass die Drag-and-Drop auf TreeWidget aktiviert.

Antwort

1

Sie müssen einen Ereignisfilter in der Baumstruktur installieren und die QObject.eventFilter Methode in Ihrer Klasse implementieren.

Beispiel (Ereignisfilter installieren):

self.ui.tree_widget_of_items.installEventFilter(self) 

Und implementieren event:

def eventFilter(self, o, e): 
    if e.type() == QEvent.DragEnter: #remember to accept the enter event 
     e.acceptProposedAction() 
     return True 
    if e.type() == QEvent.Drop: 
     # handle the event 
     # ... 
     return True 
    return False #remember to return false for other event types 

Siehe QObject.installEventFilter und QObject.eventFilter

+0

Awesome, dank Fabio! – user2259784

1

Um Ereignisse in dynamischer Benutzeroberfläche zu implementieren (was bedeutet, UI in Qt erstellt -designer und in Python-Tool mit .ui-Datei verwendet). Sie müssen folgende Dinge:

  1. Mainwindow-Klasse des Werkzeugs QtGui.QMainWindow erben sollte

    class main_window(QtGui.QMainWindow): 
    
  2. Es sollte Super() aufrufen. init()

    class main_window(QtGui.QMainWindow): 
        def __init__(self, parent=None): 
         super(main_window, self).__init__(parent) 
    
         loader = QUiLoader() 
         file = QtCore.QFile(os.path.join(SCRIPT_DIRECTORY, 'mainwindow.ui')) 
         file.open(QtCore.QFile.ReadOnly) 
         if parent: 
          self.ui = loader.load(file, parentWidget=parent) 
         else: 
          self.ui = loader.load(file) 
         file.close() 
    
  3. Installieren Eventfilter auf Komponente:

    self.ui.tree_widget_of_items.installEventFilter(self)  
    # not --> self.ui.tree_widget_of_items.installEventFilter(self.ui) 
    
  4. definieren event():

    def eventFilter(self, o, e): 
    if (o.objectName() == "tree_widget_of_items"): 
        if e.type() == QtCore.QEvent.Type.Enter: 
         self.drop_action(e) 
    
Verwandte Themen