QT简单DRAG AND DROP

其实如果是从外部拖东西进来只需要重写两个函数

    virtual void    dragEnterEvent ( QDragEnterEvent * event );  //允许什么可以拖进来
    virtual void    dropEvent ( QDropEvent * event );  //拖进来发生什么事

下面是拖图片进来的例子:

void MyLabel::dragEnterEvent( QDragEnterEvent * event )    //
{
    if (event->mimeData()->hasUrls())    //判断接受DRAG的类型,图片,文件(夹)之类的为RULS类型
    {
        event->accept();

    }
    else
        event->ignore();
}

void MyLabel::dropEvent( QDropEvent * event )
{
    if (event->mimeData()->hasUrls())   //判断接受类型
    {
        QList<QUrl> list = event->mimeData()->urls();  //获取路径


        QString fileName = list[0].toLocalFile();  //因为是简单例子我们就取第一个(其实这里是一个路径集,如何处理自己写)
        int index = fileName.indexOf(".jpg",Qt::CaseInsensitive);  //判断是.JPG格式的
        if (index != -1 )
        {

                QLabel *labelTemp = new QLabel(this);
                labelTemp->setAttribute(Qt::WA_DeleteOnClose);
                labelTemp->setPixmap(QPixmap(fileName));
                labelTemp->resize(100,100);

                labelTemp->show();                   //写这么多是为了和下面的合一起,如果只是测这个用下面注释的一行就行了
                //this->setPixmap(QPixmap(fileName));
        }
        event->accept();
    }
    else
    {
        event->ignore();
    }

}

 

记得在构造函数里     this->setAcceptDrops(true);

如果是在WIDGET中拖到另一个也不是很难,多写两个函数:

    virtual void    mousePressEvent ( QMouseEvent * event ); //自定义DRAG类型,和发生DRAG行为

    virtual void    dragMoveEvent ( QDragMoveEvent * event );  //DRAG时发生的事

 

简单伤心下就可和上面的合一起.实现将图片从桌面拖入,再把图片 在两个窗口中拖动,(在MAIN里生成两个WIDGET就行了

void Drag::mousePressEvent( QMouseEvent * event )
{
    QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
    if (!child)
    {
        return;
    }

    QPixmap pixmap = *child->pixmap();

    QByteArray itemData;       //定义QByteArray变量并向里面传数据
    QDataStream dataStream(&itemData,QIODevice::WriteOnly);
    dataStream << pixmap;

    QMimeData *mimeData = new QMimeData; //定义MimeData类型并定义类型KEY
    mimeData->setData("appliction/x-dnditemdata",itemData);

    QDrag *drag = new QDrag(this);     //定义一个DRAG行为,并把MimeData放进去
    drag->setMimeData(mimeData);
    drag->setPixmap(pixmap);               //设置拖DRAG时的图片
    drag->setHotSpot(QPoint(drag->pixmap().width()/2,drag->pixmap().height()/2));  //图片位置


    if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)
    {
        child->close();
    }
    else
    {
        child->show();
        child->setPixmap(pixmap);
    }

}

 

 

void Drag::dragMoveEvent( QDragMoveEvent * event ) //和DRAGENTER 大同小异
{
    if (event->mimeData()->hasFormat("appliction/x-dnditemdata")) //判断DRAG类型,
    {
        if (event->source() == this)  //在自己里拖动自己,可设置特殊事件
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else
        {
            event->acceptProposedAction();
        }
    }
    else
    {
        event->ignore();
    }
}

 

 

 

 

你可能感兴趣的:(list,qt)