gpt4 book ai didi

drag-and-drop - 如何拖放到 QTableWidget 中? (PyQT)

转载 作者:行者123 更新时间:2023-12-04 03:43:09 25 4
gpt4 key购买 nike

我正在努力让拖放工作。我希望能够从 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()

最佳答案

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

Subclassing Complex Widgets
Certain standard Qt widgets provide their own support for drag and drop. When subclassing these widgets, it may be necessary to reimplement dragMoveEvent() in addition to dragEnterEvent() and dropEvent() to prevent the base class from providing default drag and drop handling, and to handle any special cases you are interested in.


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

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

关于drag-and-drop - 如何拖放到 QTableWidget 中? (PyQT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10264040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com