关于QListWidget的Drag和Drop用法

来源:互联网 发布:linux查看gz文件内容 编辑:程序博客网 时间:2024/05/08 20:38

QListWIdget的Drag和Drop. 真是坑爹到不行...

其实很简单的.. 最后搞到好多行代码..

真是作死的节奏...............


先上代码:<这种方法也可以实现, 但是太麻烦了...>

#include "PlayerDragWidget.h"#include "PlayerLyricsListItem.h"#include <QDrag>#include <QPainter>#include <QDragEnterEvent>#include <QList>#include <QDebug>PlayerDragWidget::PlayerDragWidget(QWidget *parent): QListWidget(parent){setAcceptDrops(true);}PlayerDragWidget::~PlayerDragWidget(){}void PlayerDragWidget::dragEnterEvent( QDragEnterEvent * event ){PlayerDragWidget *source = (PlayerDragWidget *)((void*)(event->source()));if (source && source == this) {event->setDropAction(Qt::MoveAction);event->accept();}else{event->setDropAction(Qt::CopyAction);event->accept();}}void PlayerDragWidget::dragMoveEvent( QDragMoveEvent * event ){PlayerDragWidget *source = (PlayerDragWidget *)((void*)(event->source()));if (source && source == this) {event->setDropAction(Qt::MoveAction);event->accept();}}void PlayerDragWidget::dragLeaveEvent( QDragLeaveEvent * event ){//PlayerDragWidget *source = (PlayerDragWidget *)((void*)(event->source()));//if (source && source == this) {//event->setDropAction(Qt::MoveAction);//event->accept();//}//else//{//event->dra//}}void PlayerDragWidget::dropEvent( QDropEvent * event ){PlayerDragWidget *source = (PlayerDragWidget *)((void*)(event->source()));if (source && source == this) {endPos = event->pos();//得到鼠标移动到的坐标QListWidgetItem *itemRow = itemAt(endPos);if(itemRow){const QMimeData* data = event->mimeData();QVariant var;if(data->hasColor()){var = data->colorData();}MusicInfo songInfo;if(var.canConvert<MusicInfo>()){songInfo = var.value<MusicInfo>();}int rowInsert = row(itemRow);emit sigItemDragDrop(rowInsert+1, songInfo);}else{const QMimeData* data = event->mimeData();QVariant var;if(data->hasColor()){var = data->colorData();}MusicInfo songInfo;if(var.canConvert<MusicInfo>()){songInfo = var.value<MusicInfo>();}emit sigItemDragDrop(count(), songInfo);}event->setDropAction(Qt::MoveAction);event->accept();}else{QList<QUrl> urls = event->mimeData()->urls();if(urls.isEmpty())return;emit sigAddDragItems(urls);event->accept();}}void PlayerDragWidget::mousePressEvent( QMouseEvent *event ){if (event->button() == Qt::LeftButton)startPos = event->pos();QListWidget::mousePressEvent(event);}void PlayerDragWidget::mouseMoveEvent(QMouseEvent *event){QListWidgetItem *item = currentItem();mimeData = new QMimeData;MusicInfo info;QWidget* wid = itemWidget(item);if(wid){PlayerLyricsListItem* lyricsWid = qobject_cast<PlayerLyricsListItem*>(wid);if(lyricsWid){info = lyricsWid->GetItemInfo();QVariant var = QVariant::fromValue(info);mimeData->setColorData(var);}}QDrag *drag = new QDrag(this);drag->setMimeData(mimeData);QPixmap pixmap(QSize(175,20));QPainter p(&pixmap);p.drawText(QRectF(10, 0, 175, 20), Qt::AlignVCenter, info.strTitle+" - "+info.strArtist);drag->setPixmap(pixmap);Qt::DropAction dropAction = drag->exec(Qt::MoveAction, Qt::MoveAction);if(dropAction == Qt::MoveAction){delete item;//删除原有的item,在dropEvent(QDropEvent *event)函数中插入item}QListWidget::mouseMoveEvent(event);}

简单方法, 其实只需要设置这几个属性就OK了..:

上图:



唉.. 不作死就不会死....

0 0
原创粉丝点击