QT窗口中的拖动

本文介绍如何在QT中实现两个列表框间的项目拖放功能。通过重写myListWidget类及其实现的五个关键事件,包括鼠标按下、移动、拖动进入、拖动移动和放置事件。文中详细解释了各步骤的具体实现。

                                                                         QT窗口中的拖动
例如:下面有两个列表框,把其中一个列表框中的一项拖动到另外一个列表框中

                                   下面是拖动之后的图片

 

实现思路:

重新写一个myListWidget类继承于系统的QListWidget类

里面重新写5个系统事件:(.h文件中)

void mousePressEvent(QMouseEvent *event);                               //鼠标按下事件

void mouseMoveEvent(QMouseEvent *event);                               //鼠标移动事件

void dragEnterEvent(QDragEnterEvent *event);                              //myListWidget检测到有东西拖过来触发的事件 

void dropEvent(QDropEvent *event);                                              //拖动放到目标位置触发的事件

void dragMoveEvent(QDragMoveEvent *e);                                    //拖动过程中触发的事件

void Init();                                                            //初始化函数

 


 
.cpp文件中

void myListWidget::Init()

{

           this->setAcceptDrops(true);                                   //设置this可以接受拖动,没有这个不会触发拖动事件

           QFont* font = new QFont("微软雅黑",25,3);           //字体

           this->setFont(*font);            //设置窗口字体,

}

//头文件中添加#include <QMouseEvent>

void myListWidget::mousePressEvent(QMouseEvent *event) //如果没有这个事件则不能选定列表项

{

if(event->button()&Qt::LeftButton) //只有左键按下时才为真

{

QListWidget::mousePressEvent(event); //持续触发鼠标按下,直到有别的操作

}

}



//头文件中添加#include <mouseMoveEvent>

void myListWidget::mouseMoveEvent(QMouseEvent *event)

{

if(event->button()&Qt::LeftButton) //只有左键按下时才能拖动

{

QListWidgetItem* list_01 = this->currentItem(); //得到当前选中的列表项

if(list_01)

{

QMimeData* mimdata = new QMimeData(); //头文件中添加#include <QMimeData>

//把当前选中列表项的文本保存到QMimeData中,以后可以在DropEvent中取出来

mimdata->setText(list_01->text());



QDrag* drag = new QDrag(this);

//把mimdata中保存的数据随着拖动发送到另一个窗口中

drag->setPixmap(QPixmap(" 这里面写图标路径 "));

//设置拖动过程中显示的图标

drag->setMimeData(mimdata);

//把mimdata设置到drag中

drag->exec(Qt::MoveAction);

//启动drag,参数表示drag类型,因为这里是拖动所以是Qt::MoveAction


delete list_01; //释放list_01,把原ListWidget中的拖动项删除掉

QListWidget::mouseMoveEvent(event); //持续触发鼠标移动,直到有别的操作

}

}

}




//头文件中添加#include <QDragEnterEvent>

void mylistWidget::dragEnterEvent(QDragEnterEvent *event)

{

QListWidget* listwidget = qobject_cast<QListWidget*>(event->source());

//取得拖动事件触发的原object,这里的qobject_cast<QListWidget*>是Qt中的类型转换




if(listwidget != NULL && listwidget != this)

{

event->setDropAction(Qt::MoveAction); // 设置拖动属性

event->accept(); //持续接受

}

}



//头文件中添加#include <QDragMoveEvent>

void mylistWidget::dragMoveEvent(QDragMoveEvent *e)

{

QListWidget* listwidget = qobject_cast<QListWidget*>(e->source());

if(listwidget != NULL && listwidget != this)

{

e->setDropAction(Qt::MoveAction);

e->accept();

}

}


//头文件中添加#include <QDropEvent>

void mylistWidget::dropEvent(QDropEvent *event)

{


QListWidget* listwidget = qobject_cast<QListWidget*>(event->source());

if(listwidget != NULL && listwidget != this)

{

QString str = event->mimeData()->text();

//取得mouseMoveEvent事件中设置的mimdata中的值


QListWidgetItem* l1 = new QListWidgetItem(str);

this->addItem(l1);


this->setCurrentItem(l1); //设置列表项焦点



event->setDropAction(Qt::MoveAction);

event->accept();

}

}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值