【问题标题】:How to drag and drop into a QTableWidget? (PyQT)如何拖放到 QTableWidget 中? (PyQT)
【发布时间】:2012-05-03 02:10:12
【问题描述】:

我正在努力让拖放工作。我希望能够从 QPushButton 拖放到 QTableView 的单元格中。我在网上看了一些教程,但似乎停留在第一步。下面的示例是从惊人的 zetcode 教程更改而来的: http://zetcode.com/tutorials/pyqt4/dragdrop/

使用下面的代码,当我将按钮拖到 tableWidget 中时,dragEnterEvent 似乎被调用了,但是一旦我将鼠标悬停在表格上,我就会得到那个我不允许放在表格上的符号,所以永远无法到达 drop 事件:(

我不得不承认我对 pyqt 还很陌生,所以可能会遗漏一些非常简单的东西。非常感谢我能得到的任何帮助! 干杯 戴夫

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()

【问题讨论】:

    标签: drag-and-drop pyqt qtablewidget


    【解决方案1】:

    因为你是在 QTableWidget 上设置拖放,所以你还需要重新实现它是dragMoveEvent。根据docs here

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

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

    另外,请注意,虽然原始教程显示了如何在没有任何布局的情况下在小部件中移动按钮,但您的示例现在具有由垂直布局管理的按钮。因此,您的 self.button.move(position) 将无法按预期工作。虽然dropEvent 应该可以正常触发,并且当它悬停在单元格上时,您应该会看到“已接受”的拖动图标。

    【讨论】:

    • 太棒了,谢谢你,做到了!也感谢您指出布局问题。这实际上只是我正在处理的一个更复杂案例的测试案例,所以看看它是否会影响它。
    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多