Мне нужно включить кнопку в моем приложении всякий раз, когда что-то падает на мой пользовательский 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
...
фактически не собирается и смотрит сам, стандартный ответ повторно отсутствующими сигналов: попробуйте также искать события. Предполагаю, вы также нажали на ссылку, чтобы увидеть всех унаследованных? –
Я не могу понять, почему вы думаете, что «dropEvent» не помогает: он вряд ли лучше подходит для того, что вы хотите сделать. Просто [определите свой собственный] (http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html#defining-new-signals-with-pyqtsignal) сигнал 'itemDropped' и выпустите его из' dropEvent' в любой момент, когда вы чувствовать себя уместно. – ekhumoro
@ekhumoro: Вы правы. Я определил новый сигнал, который испускает его в dropEvent. Если вы опубликуете его в качестве ответа, я соглашусь с ним. – NGambit