Qt拖放

Qt拖放的操作基本上可以分为三部分:获取记录需要的数据(QMimeData),拖动操作(Drag),放下操作(Drop);

 

QMimeData:多媒体数据类,拖放事件通过该对象传递数据,支持:文本,html数据,合法路径,图片,颜色等;

 

Drag:拖放是用户在程序中复制或移动数据的一种直观方式,它处理拖放操作的大部分细节

 

QDropEvent:提供一个拖放操作完成时触发的事件

 

以拖放一个图片为例:

 

void Widget::mousePressEvent(QMouseEvent *e)//鼠标点击事件

{

    QLabel*child=static_cast<QLabel*>(childAt(e->pos()));//获取鼠标点击位置的控件

    if(!child)

    {

        return;

    }

QPixmap pixmap=*child->pixmap();//获取该控件上的图片信息

QByteArray itemData;

QDataStream dataStream(&itemData,QIODevice::WriteOnly);

dataStream<<pixmap<<QPoint(e->pos()-child->pos());

 

QMimeData*mimeData=new QMimeData;//记录需要的数据信息

mimeData->setData("appDrop",itemData);

 

QDrag*drag=new QDrag(this);//创建拖放操作

drag->setMimeData(mimeData);//关联数据,这时的拖放过程中就带上数据了

pixmap=pixmap.scaled(pixmap.width()*0.1,pixmap.height()*0.1);

drag->setPixmap(pixmap);//设置拖动时鼠标下的图片显示

drag->setHotSpot(e->pos());//位置,可注释下看效果

 

QPixmap tempPixmap=pixmap;

QPainter painter;

painter.begin(&tempPixmap);

drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction);//触发拖动事件,可以开始拖动

}

将内容拖到要放置的地方/控件上,松开鼠标后触发该函数

void Widget::dropEvent(QDropEvent *e)

{

     if(e->mimeData()->hasFormat("appDrop"))//判断拖动操作上携带的数据是否存在

    {   将携带的数据解析出来,解析成原有的图片,文字,位置等信息

       QByteArray itemData=e->mimeData()->data("appDrop");

       QDataStream dataStream(&itemData,QIODevice::ReadOnly);

 

       QPixmap pixmap;

       QPoint offset;

       dataStream>>pixmap>>offset;

//在放置位置进行显示数据操作

       ui->label_2->setPixmap(pixmap);//前提setAcceptDrops(true);

     }

}

//拖放鼠标进入目标控件

void Widget::dragEnterEvent(QDragEnterEvent *e)

{

    if(e->mimeData()->hasFormat("appDrop"))

    {

        if(e->source()==this)

        {

            e->setDropAction(Qt::MoveAction);

            e->accept();

        }

        else{

            e->acceptProposedAction();

        }

    }else

    {

        e->ignore();

    }

}

setAcceptDrops(bool);//设置部件是否接受放下事件(drop),

event->acceptProposedAction()//把拖放操作设置为建议的操作并接受该事件

event->ignore()//忽略该数据,用来处理不可用的数据

 

enum DropAction {

        CopyAction = 0x1,//将数据复制到目标

        MoveAction = 0x2,//将数据从源移动到目标

        LinkAction = 0x4,//创建从源到目标的链接

        ActionMask = 0xff,//无解释

        TargetMoveAction = 0x8002,//

        IgnoreAction = 0x0  //忽略操作(不处理数据)

    };

 

 

 

 

 

发布了104 篇原创文章 · 获赞 22 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41672557/article/details/103285437