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();
}
}