0
点赞
收藏
分享

微信扫一扫

Qt 两个重载QListWidget控件对象实现selectitem drag拖拽

#include <QListWidget>
#include <QWidget>
#include <QMimeData>
#include <QDrag>
#include <QMouseEvent>
#include <QDragEnterEvent>
#include <qDebug>
#include <QApplication>

class myListWidget : public QListWidget
{
Q_OBJECT
public:
explicit myListWidget(QWidget *parent = nullptr);

protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
void InitMyListWidget();

private:
QListWidgetItem * current_item;
QPoint start;
};









myListWidget::myListWidget(QWidget *parent) : QListWidget(parent)
{
this->setAcceptDrops(true);
current_item = NULL;
}

void myListWidget::mousePressEvent(QMouseEvent *event)
{
qDebug()<<"mousePressEvent";
if(event->button() != Qt::LeftButton){//按下的不是鼠标左键
return;
}
start = event->pos();
QListWidget::mousePressEvent(event);
}


void myListWidget::mouseMoveEvent(QMouseEvent *event)
{
qDebug()<<"mouseMoveEvent";
if(event->buttons() & Qt::LeftButton){//按下的是鼠标左键
//判断拖动的长度大于起始长度才认为是拖动,否则不做拖动
int distance = (event->pos() - start).manhattanLength();
if(distance >= QApplication::startDragDistance()){


//获取当前被选中的值
current_item = this->currentItem();
if(current_item){
//准备需要传送的数据
QMimeData * mimedata = new QMimeData();
mimedata->setText(current_item->text());
//test = current_item->text();
//准备传送的对象
QDrag* drag = new QDrag(this);
drag->setMimeData(mimedata);

//1.1 设置drag对象的图标,拖拽时显示的图标
drag->setPixmap(QPixmap(":/new/prefix1/stop.png"));
//1.2进行拖动操作
if(Qt::MoveAction == drag->exec(Qt::MoveAction)){
delete current_item;
}


QListWidget::mouseMoveEvent(event);
}
}
}
}

void myListWidget::dragEnterEvent(QDragEnterEvent *event)
{
qDebug()<<"dragEnterEvent";
QListWidget* source = qobject_cast<QListWidget*>(event->source());
//判断是否位空,判断自己是为自己
if(source!=NULL && (source!=this)){
event->setDropAction(Qt::MoveAction);
event->accept();
}
}

void myListWidget::dragMoveEvent(QDragMoveEvent *event)
{
qDebug()<<"dragMoveEvent";
QListWidget* source = qobject_cast<QListWidget*>(event->source());
//判断是否位空,判断自己是为自己
if(source!=NULL && (source!=this)){
event->setDropAction(Qt::MoveAction);
event->accept();
}
}

void myListWidget::dropEvent(QDropEvent *event)
{
QListWidget* source = qobject_cast<QListWidget*>(event->source());
//判断是否为空,判断是否自身为空
if(source != NULL && source != this){
QList<QListWidgetItem*> it = source->selectedItems();
//QString str = event->mimeData()->text();
//QListWidgetItem * l1 = new QListWidgetItem(QIcon(":/new/prefix1/video-ok.png"),str);
QListWidgetItem * l1 = new QListWidgetItem(*it.front());//
this->addItem(l1);
this->setCurrentItem(l1);
event->setDropAction(Qt::MoveAction);
event->accept();

}
}

举报

相关推荐

0 条评论