项目里的需求是从Qlistwidget拖拽到另一个QlistView上,并且在Qlistwidget内不可拖动元素。
1 Qlistwidget内不可拖动元素,可以重写dropEvent事件。
void MTListWidget::dropEvent( QDropEvent *event )
{
if (event->source() == this) //不允许本控件内拖动
event->ignore();
else
event->accept();
}
2 从Qlistwidget拖拽到另一个QlistView
我在startDrag中添加了在拖拽过程中要传送的data数据,用于传输给QlistView
void MTListWidget::startDrag( Qt::DropActions supportedActions )
{
Q_UNUSED(supportedActions);
QList <QListWidgetItem*> items ;//注意 items是个Qlist 其中的元素是QListWidgetItem
items=selectedItems();
QString fileNames;
if(items.size()==0)
{
return;
}
else
{
QString filetype = items[0]->data(Qt::UserRole+1).toString(); //获取拖放的文件类型
fileNames += filetype;
fileNames += "\n";
for(int i =0; i<items.size(); i++)//遍历所选的ITEM
{
QListWidgetItem*sel = items[i];
QString strName = sel->data(Qt::UserRole).toString(); // 获取全路径
fileNames += strName;
fileNames += "\n";
}
}
QByteArray fileData;
fileData = QVariant(fileNames).toByteArray();
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-qabstractitemmodeldatalist", fileData);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->exec(Qt::CopyAction);
}
3QlistView接收
使用的eventFiler截获drop事件,使用m_listView->viewport()来注册事件过滤器。
if (object == m_listView->viewport())
{
if(event->type() == QEvent::Drop)//实现拖放
{
QAbstractItemView* source = qobject_cast<QAbstractItemView *>(((QDropEvent *)event)->source());
const QMimeData *mime = ((QDropEvent *)event)->mimeData();
QByteArray encodedata = mime->data("application/x-qabstractitemmodeldatalist");
if (source && source != m_listView) //QlistWidget向Qlistview拖动
{
//do something
return true; //一定要返回
}
else if(source && source == m_listView)Qlistview内部拖动
{
if (encodedata.isEmpty()) //判空
{
return false;
}
//do something
return true;
}
}
}