tutorial drag-and-drop pyqt qtablewidget

drag-and-drop - tutorial - pyqt matplotlib



¿Cómo arrastrar y soltar en un QTableWidget?(PyQT) (1)

Como está configurando arrastrar y soltar en un QTableWidget, también necesita volver a implementar su dragMoveEvent . De acuerdo con los documentos aquí :

Subclasificación de widgets complejos
Ciertos widgets Qt estándar proporcionan su propio soporte para arrastrar y soltar. Al crear subclases de estos widgets, puede ser necesario volver a implementar dragMoveEvent () además de dragEnterEvent () y dropEvent () para evitar que la clase base proporcione un manejo predeterminado de arrastrar y soltar, y para manejar cualquier caso especial que le interese.

class MyTable(QtGui.QTableWidget): ... def dragMoveEvent(self, e): e.accept()

Además, tenga en cuenta que si bien el tutorial original muestra cómo mover un botón dentro de un widget sin ningún diseño, su ejemplo ahora tiene el botón administrado por un diseño vertical. Entonces su self.button.move(position) no funcionará como se esperaba. Aunque dropEvent debería dispararse correctamente y debería estar recibiendo el ícono de arrastre "aceptado" cuando está sobre una celda.

Estoy luchando para que Arrastrar y Soltar funcione. Quiero poder arrastrar y soltar desde un QPushButton a una celda de QTableView. He visto algunos tutoriales en línea, pero parece que están estancados en el primer paso. El siguiente ejemplo ha cambiado del sorprendente tutorial de zetcode: http://zetcode.com/tutorials/pyqt4/dragdrop/

Utilizando el siguiente código, cuando arrastro el botón hacia el widget de la mesa, parece que se llama al dragEnterEvent, pero una vez que coloco el mouse sobre la mesa, aparece el símbolo que no puedo dejar caer sobre la mesa, así que nunca puedo llegar al evento drop :(

Tengo que admitir que soy bastante nuevo en pyqt, por lo que puede estar perdiendo algo muy simple. ¡Realmente agradecería cualquier ayuda que pudiera obtener! Saludos Dave

import sys from PyQt4 import QtGui from PyQt4 import QtCore class Button(QtGui.QPushButton): def __init__(self, title, parent): super(Button, self).__init__(title, parent) def mouseMoveEvent(self, e): if e.buttons() != QtCore.Qt.RightButton: return mimeData = QtCore.QMimeData() drag = QtGui.QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(e.pos() - self.rect().topLeft()) dropAction = drag.start(QtCore.Qt.MoveAction) def mousePressEvent(self, e): QtGui.QPushButton.mousePressEvent(self, e) if e.button() == QtCore.Qt.LeftButton: print ''press'' class MyTable(QtGui.QTableWidget): def __init__(self, rows, columns, parent): super(MyTable, self).__init__(rows, columns, parent) self.setAcceptDrops(True) def dragEnterEvent(self, e): print e.accept() def dropEvent(self, e): print ''blah'' position = e.pos() self.button.move(position) e.setDropAction(QtCore.Qt.MoveAction) e.accept() class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.setAcceptDrops(True) self.button = Button(''Button'', self) self.table = MyTable(2,2,self) self.table.setAcceptDrops(True) self.table.setDragEnabled(True) self.setWindowTitle(''Click or Move'') self.setGeometry(300, 300, 280, 150) layout = QtGui.QVBoxLayout() layout.addWidget(self.button) layout.addWidget(self.table) self.setLayout(layout) def main(): app = QtGui.QApplication(sys.argv) ex = Example() ex.show() app.exec_() if __name__ == ''__main__'': main()