2015-03-19 8 views
1

Мне нужно включить кнопку в моем приложении всякий раз, когда что-то падает на мой пользовательский QTreeWidget.pyqt Сигнал QTreeWidget на падение элемента

Я подклассифицировал QTreeWidget для реализации перетаскивания пользовательских данных. Но я не могу найти способ получить уведомление, когда что-то упало в мой пользовательский QTreeWidget. Я не смог найти QTreeWidget signal, чтобы сделать это. Конечно, dropEvent() QTreeWidget будет вызываться каждый раз, когда что-то отбрасывается, но это не очень помогает в достижении того, что я пытаюсь сделать.

Вот где я создаю экземпляр пользовательского QTreeWidget, который принимает капли от другого виджета,

from PyQt4 import QtCore, QtGui 
import MyTreeWidget 

class TestWindow(QtGui.QDialog): 
    def __init__(self, parent=None): 
    super(TestWindow, self).__init__(parent) 
    self.myTreeWidget = MyTreeWidget.MyTreeWidget() 
    ... 
    #self.myTreeWidget.onItemDropped.connect(self.doSomethingOnItemDropped) <== I am looking for something like this 

    def doSomethingOnItemDropped(self): 
    # Enable certain button 

    ... 

А потом, вот как я к югу классифицироваться QTreeWidget,

import sys 
from PyQt4 import QtGui, QtCore 

class MyTreeWidget(QtGui.QTreeWidget): 
    def __init__(self, parent=None): 
    super(MyTreeWidget, self).__init__(parent) 
    self.setAcceptDrops(True) 

    def dropEvent(self, event): 
    if (event.mimeData().hasFormat('application/x-icon-and-text')): 
     event.acceptProposedAction() 
     data = event.mimeData().data("application/x-icon-and-text") 
     stream= QtCore.QDataStream(data, QtCore.QIODevice.ReadOnly) 
     text = QtCore.QString() 
     icon = QtGui.QIcon() 
     stream >> text >> icon 
     item = QtGui.QTreeWidgetItem(self) 
     item.setText(0, text) 
     item.setIcon(0, icon) 
     self.addTopLevelItem(item)  
    else: 
     event.ignore() 

    def dragEnterEvent(self, event): 
    if (event.mimeData().hasFormat('application/x-icon-and-text')): 
     event.accept() 
    else: 
     event.ignore() 

    def dragMoveEvent(self, event): 
    if event.mimeData().hasFormat("application/x-icon-and-text"): 
     event.setDropAction(QtCore.Qt.CopyAction) 
     event.accept() 
    else: 
     event.ignore() 

Любые идеи? Благодаря!

UPDATE: Это то, что работает для меня

Основываясь на комментарий по @ekhumoro я определил пользовательский сигнал itemDropped для моего обычая QTreeWidget, выдающий в dropEvent) обработчик событий (.

import sys 
    from PyQt4 import QtGui, QtCore 

    class MyTreeWidget(QtGui.QTreeWidget): 

     itemDropped = QtCore.pyqtSignal() 

     def __init__(self, parent=None): 
     super(MyTreeWidget, self).__init__(parent) 
     self.setAcceptDrops(True) 

     def dropEvent(self, event): 
     if (event.mimeData().hasFormat('application/x-icon-and-text')): 
      event.acceptProposedAction() 
      data = event.mimeData().data("application/x-icon-and-text") 
      stream= QtCore.QDataStream(data, QtCore.QIODevice.ReadOnly) 
      text = QtCore.QString() 
      icon = QtGui.QIcon() 
      stream >> text >> icon 
      item = QtGui.QTreeWidgetItem(self) 
      item.setText(0, text) 
      item.setIcon(0, icon) 
      self.addTopLevelItem(item) 
      self.itemDropped.emit() 
     else: 
      event.ignore() 

И в мое приложение,

from PyQt4 import QtCore, QtGui 
    import MyTreeWidget 

    class TestWindow(QtGui.QDialog): 
     def __init__(self, parent=None): 
     super(TestWindow, self).__init__(parent) 
     self.myTreeWidget = MyTreeWidget.MyTreeWidget() 
     self.myTreeWidget.itemDropped.connect(self.doSomethingOnItemDropped) 
     ... 

     def doSomethingOnItemDropped(self): 
     # Enable certain button 

     ... 
+0

фактически не собирается и смотрит сам, стандартный ответ повторно отсутствующими сигналов: попробуйте также искать события. Предполагаю, вы также нажали на ссылку, чтобы увидеть всех унаследованных? –

+2

Я не могу понять, почему вы думаете, что «dropEvent» не помогает: он вряд ли лучше подходит для того, что вы хотите сделать. Просто [определите свой собственный] (http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html#defining-new-signals-with-pyqtsignal) сигнал 'itemDropped' и выпустите его из' dropEvent' в любой момент, когда вы чувствовать себя уместно. – ekhumoro

+0

@ekhumoro: Вы правы. Я определил новый сигнал, который испускает его в dropEvent. Если вы опубликуете его в качестве ответа, я соглашусь с ним. – NGambit

ответ

1

Вы можете задать пользовательский сигнал и испускать его из dropEvent:

class MyTreeWidget(QtGui.QTreeWidget): 
    itemDropped = QtCore.pyqtSignal() 

    def dropEvent(self, event): 
     if (event.mimeData().hasFormat('application/x-icon-and-text')): 
      ... 
      self.itemDropped.emit() 

 Смежные вопросы

  • Нет связанных вопросов^_^