2011-11-30 51 views
2

我需要處理一些數據後,一個放置事件發生在一個小部件。Qt丟棄事件後

即用戶選擇列表中的一個部分項目,並丟棄它們在列表B.我的程序需要B已經添加從A

任何想法選定項目後,比較2所列出?

回答

1

這裏有一個PyQt的腳本演示兩種方法陷阱丟棄事件:

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     widget = QtGui.QWidget(self) 
     self.setCentralWidget(widget) 
     layout = QtGui.QVBoxLayout(widget) 
     self.listA = ListWidget(self) 
     self.listB = QtGui.QListWidget(self) 
     self.listB.viewport().installEventFilter(self) 
     for widget in (self.listA, self.listB): 
      widget.setAcceptDrops(True) 
      widget.setDragEnabled(True) 
      for item in 'One Two Three Four Five Six'.split(): 
       widget.addItem(item) 
      layout.addWidget(widget) 

    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.Drop and 
      source is self.listB.viewport()): 
      self.listB.dropEvent(event) 
      if event.isAccepted(): 
       print 'eventFilter', self.listB.count() 
      return True 
     return QtGui.QMainWindow.eventFilter(self, source, event) 

class ListWidget(QtGui.QListWidget): 
    def __init__(self, parent): 
     QtGui.QListWidget.__init__(self, parent) 

    def dropEvent(self, event): 
     QtGui.QListWidget.dropEvent(self, event) 
     if event.isAccepted(): 
      print 'dropEvent', self.count() 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

這就是完美!謝謝 – Jared

+0

tableView-> ** viewport()** - > installEventFilter(this)是這裏的重要部分。 :-) –

1

您正在收聽的事件是QDropEvent。要做到在收到該事件的一些工作,你需要:


EDIT:走向更深入:

  1. 重新實現dropEvent

部首:

cDropTarget : public QWidget 
{ 
    Q_OBJECT 

public: 
    cDropTarget(QWidget *Parent = 0); 

protected: 
    virtual void dropEvent(QDropEvent *event); 
} 

實現:

cDropTarget::cDropTarget(QWidget *Parent) 
    : QWidget(Parent) 
{ 
    setAcceptDrops(true); 
} 

void cDropTarget::dropEvent(QDropEvent *event) 
{ 
    //check that you want to process the drop event 
    //i.e. its mimeData()->hasFormat(that you can interpret) 

    //extract mimeData() from the drop event 

    //do something with it 
} 
  1. 使用單獨的事件過濾器

頭:

cDropEventFilter : public QObject 
{ 
    ... 

protected: 
    virtual bool eventFilter(QObject *watched, QEvent *event); 

    ... 
} 

實施:

bool cDropEventFilter::eventFilter(QObject *watched, QEvent *event) 
{ 
    if(event->type() == QEvent::DropEnter) 
    { 
    QDropEvent *DropEvent = static_cast<QDropEvent*>(event); 
    if (DropEvent->mimeData()->hasFormat(MIME_TYPE)) 
    { 

     DropEvent->acceptProposedAction(); 
     return true; 
    } 
    } 
    else 
    { 
    return QObject::eventFilter(watched, event); 
    } 

    //Handle all events not matching mimeData format MIME_TYPE 
    event->ignore(); 
    return true; 
} 
+0

謝謝,但請你能否舉個例子? – Jared

+0

完成,請參閱編輯。 – sjwarner

+0

我試着創建自己的列表類,然後用自己的自定義代碼重寫拖放事件,但無法獲取代碼以保留已放置的小部件。感謝細節和例子雖然:) – Jared

1

得到它的工作!

我對任何有興趣代碼:

class MyList(QListWidget): 
    def __init__(self , parent = None): 
     super(MyList, self).__init__(parent) 

     self.setAlternatingRowColors(True) 
     self.setDragDropMode(QAbstractItemView.InternalMove) 


    def dropEvent(self , event): 
     # get index to insert at 
     insertPos = event.pos() 
     fromList = event.source() 
     insertRow = fromList.row(fromList.itemAt(insertPos)) 

     lowestRow = insertRow 
     for item in fromList.selectedItems(): 
      name = item.text() 
      sip.delete(item) 

      listItem = QListWidgetItem(name) 
      listItem.setTextAlignment(Qt.AlignHCenter) 
      self.insertItem(insertRow , listItem) 
      insertRow += 1 

     self.emit(SIGNAL("stuffDropped") , lowestRow) 

     event.accept()