[Qt]Qt--拖拽实现

来源:互联网 发布:贪心算法实例 编辑:程序博客网 时间:2024/05/19 00:51

项目里的需求是从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;
}
}
}