如何在PyQT中将内容拖放到QTableWidget中?

5
我在尝试实现拖放功能时遇到了困难。我希望能从QPushButton中将内容拖放到QTableView的单元格中。我查看了一些在线教程,但似乎卡在了第一步。下面这个例子是基于zetcode教程改编的: http://zetcode.com/tutorials/pyqt4/dragdrop/ 使用以下代码时,当我将按钮拖入tableWidget时,dragEnterEvent似乎被调用了,但是一旦我将鼠标悬停在表格上方,就会得到一个禁止拖放的符号,因此无法触发drop事件。
我承认我对pyqt相当陌生,可能错过了一些非常简单的东西。非常感谢您提供任何帮助! 谢谢, 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()
1个回答

7
因为您正在QTableWidget上设置拖放,所以还需要重新实现它的dragMoveEvent。根据此处的文档

子类化复杂小部件
某些标准Qt小部件提供了它们自己的拖放支持。当对这些小部件进行子类化时,可能需要重新实现dragMoveEvent(),除了dragEnterEvent()和dropEvent()之外,以防止基类提供默认的拖放处理,并处理您感兴趣的任何特殊情况。

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

此外,请注意,虽然原始教程展示了如何在没有任何布局的小部件中移动按钮,但是您的示例现在是由垂直布局管理的按钮。因此,您的 self.button.move(position) 不会按预期工作。尽管dropEvent应该正确触发,并且当它悬停在单元格上时,您应该会得到“接受”的拖动图标。

太棒了,谢谢你,就这样吧!还要感谢你指出布局问题。这只是我正在处理的更复杂案例的一个测试用例,所以我会看看它是否会对其产生影响。 - David Basalla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接