4

ドラッグ&ドロップがうまくいかなくて困っています。QPushButton から QTableView のセルにドラッグ アンド ドロップできるようにしたいと考えています。オンラインでいくつかのチュートリアルを見てきましたが、最初のステップで行き詰まっているようです。以下の例は、すばらしい zetcode チュートリアルから変更されています: http://zetcode.com/tutorials/pyqt4/dragdrop/

以下のコードを使用して、ボタンを tableWidget にドラッグすると、dragEnterEvent が呼び出されるように見えますが、マウスをテーブルの上に置くと、テーブルの上にドロップできないというシンボルが表示されるため、絶対にドロップできませんドロップイベントに行きます:(

私は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()
4

1 に答える 1

6

QTableWidget でドラッグ アンド ドロップを設定しているため、それを再実装する必要もありますdragMoveEventここのドキュメントに従って:

複雑なウィジェットのサブクラス
化 特定の標準 Qt ウィジェットは、ドラッグ アンド ドロップを独自にサポートしています。これらのウィジェットをサブクラス化する場合、dragEnterEvent() および dropEvent() に加えて dragMoveEvent() を再実装して、基本クラスがデフォルトのドラッグ アンド ドロップ処理を提供しないようにし、関心のある特殊なケースを処理する必要がある場合があります。

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

また、元のチュートリアルではレイアウトなしでウィジェット内でボタンを移動する方法が示されていますが、この例では、垂直レイアウトによって管理されるボタンが含まれていることに注意してください。したがって、self.button.move(position)期待どおりに機能しません。はdropEvent適切に起動するはずですが、セルをホバリングすると「受け入れられた」ドラッグアイコンが表示されるはずです。

于 2012-04-22T23:36:48.490 に答える