Q
Qt丟棄事件後
2
A
回答
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_())
1
您正在收聽的事件是QDropEvent
。要做到在收到該事件的一些工作,你需要:
- 重新實現
QWidget::dropEvent
目標部件或 - 使用單獨的控制器部件作爲放置目標的事件過濾器(重新實現
QObject::eventFilter
然後將其安裝到目標[installEventFilter
])。
EDIT:走向更深入:
- 重新實現
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
}
- 使用單獨的事件過濾器
頭:
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;
}
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()
相關問題
- 1. StreamInsight:CleanseInput丟棄事件
- 2. jQuery UI的 - 丟棄事件
- 3. 檢測丟棄事件
- 4. SDL「丟棄」初始事件?
- 5. QT串行丟棄數據
- 6. Qt覆蓋(丟棄)框
- 7. 當ETW丟棄事件時檢測到
- 8. Fullcalendar - 何時事件被丟棄
- 9. 在Java中實現可丟棄事件?
- 10. 阻止HTML5丟棄事件兒童
- 11. Backbone.js丟棄事件不起作用
- 12. HTML5丟棄事件沒有被觸發。
- 13. Android:單擊按鈕後丟棄的事件
- 14. qt + pyqt發出丟棄的URL兩次
- 15. 事件不適用於丟棄的元素 - 用戶界面可丟棄
- 16. 如何在丟棄事件jquery上獲取丟棄項目的ID
- 17. Box.com事件API - 從流中丟棄的舊事件?
- 18. 地鐵從丟失事件獲取丟棄數據
- 19. Imageview在丟棄事件中沒有丟失
- 20. 在丟棄事件後打開對話框時Qt鼠標光標不會改變
- 21. JQuery UI:取消可丟棄丟棄
- 22. IE10在刪除文件時似乎不喜歡丟棄事件
- 23. 使用primeng p-tree組件停止節點丟棄事件
- 24. Const丟棄Qualifers:C++
- 25. MySQL丟棄表
- 26. 丟棄節能
- 27. 丟棄裝飾
- 28. 比較列表後丟棄一個
- 29. 明顯丟棄group_後的列
- 30. ImageView在丟棄後不可見
這就是完美!謝謝 – Jared
tableView-> ** viewport()** - > installEventFilter(this)是這裏的重要部分。 :-) –