2012-04-21 148 views
3

我正在努力阻止&下降工作。我希望能夠將從QPushButton拖放到QTableView的單元格中。我在網上看了一些教程,但似乎陷入了第一步。下面的例子是從驚人的zetcode教程改變: http://zetcode.com/tutorials/pyqt4/dragdrop/如何拖放到QTableWidget中? (PyQT)

使用下面的代碼,當我將按鈕拖動到tableWidget的dragEnterEvent似乎被調用,但是一旦我將鼠標懸停在桌子上,我得到這個符號,我不允許掉在桌子上,所以永遠不能到達丟棄事件:(

我不得不承認我是相當新的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() 

回答

4

因爲您正在設置拖放到QTableWidget上,您還需要重新執行它的dragMoveEvent。由於每docs here

子類複雜窗口小部件
一定的標準Qt控件提供拖放他們 自己的支持。當子類化這些小部件時,除 dragEnterEvent()和dropEvent()外,可能需要 來重新實現dragMoveEvent(),以防止基類從 提供默認的拖放處理,並處理任何特殊的 您感興趣的案例英寸

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

此外,要知道,雖然原來的教程演示如何使widget中移動的按鈕,沒有任何的佈局,你比如現在有一個垂直佈局管理的按鈕。所以你的self.button.move(position)將無法​​按預期工作。雖然dropEvent應該正確觸發,並且您應該在懸停單元格時獲得「已接受」拖動圖標。

+0

太棒了,謝謝,那就是它!也感謝您指出佈局問題。對於我正在處理的更復雜的案例來說,這實際上只是一個測試案例,所以會看到它是否會影響它。 – 2012-04-23 15:17:04

+0

@David Basalla:甜!如果這個答案解決了它,不要忘記打綠色的選中標記。祝你好運! – jdi 2012-04-23 15:31:22

+0

@jdi謝謝,自己也在想這個 – 2012-04-23 16:28:45