关于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
- 关于QListWidget的Drag和Drop用法
- HTML5中拖放Drag和drop的用法
- wxWidgets的drag和drop
- 关于drag and drop
- HTML5 drag和drop的实践
- HTML5 drag和drop的亲手实践
- html5的拖放(Drag 和 drop)
- HTML5 拖放Drag 和 drop用法以及事件介绍
- html5中drag//drop拖曳效果的用法
- Qt drag和drop演示
- HTML5 拖放(Drag和drop)
- HTML5 拖放(Drag和drop)
- Android4.0以下View的Drag和Drop简单实现
- flex day 5 air的drag和drop
- Tree控件的Drag&Drop
- Richfaces的Drag Drop支持
- JavaScript -- drop,drag的使用
- QListWidget的简单用法
- VB 无键盘鼠标操作锁屏
- iOS7新特征汇总[05]:初窥UIKit Dynamics
- 最长递增子序列
- boost(C++库)
- Android 平台上长连接的实现
- 关于QListWidget的Drag和Drop用法
- java native interface JNI 调用Java方法
- UICollectionView和UIKit Dynamics
- JAVA-从题目看算法,将输入字符串进行排序并输出
- GMM模型中gconst的计算
- java nio整理
- 第十一周-项目一-储存班长信息的学生类
- hadoop使用lzo压缩文件笔记 (CDH3u1)
- java从头学[写给自己的话]