2012-04-21 71 views
3

私はドラッグを取り除くのに苦労しています&ドロップする。 &ドロップをQPushButtonからQTableViewのセルにドラッグできるようにしたい。私はいくつかのチュートリアルをオンラインで見てきましたが、最初のステップで固まっているようです。私はtableWidgetにボタンをドラッグすると、dragEnterEventが呼び出されているようだが、私はテーブルの上にマウスを置くと、私は取得するには、以下のコードを使用して http://zetcode.com/tutorials/pyqt4/dragdrop/QTableWidgetにドラッグアンドドロップする方法は? (PyQT)

:以下の例では、驚くべきzetcodeチュートリアルから変更されました私はテーブル上にドロップすることはできませんそのシンボルは、ドロップイベントには決して得ることができない:(

私はかなり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

QTableWidgetでドラッグアンドドロップを設定しているため、dragMoveEventも再実装する必要があります。 docs hereあたりのとおり:

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

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

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

+0

恐ろしく、ありがとうございます!また、レイアウトの問題を指摘してくれてありがとう。これは実際には私が取り組んでいるより複雑なケースのためのテストケースでしたので、それがまったくそれに影響するかどうかは分かります。 –

+0

@David Basalla:甘い!この答えが解決すれば、緑色のチェックマークを押すのを忘れないでください。がんばろう! – jdi

+0

@jdiありがとうございました –

関連する問題