QT简单DRAG AND DROP

    技术2022-05-12  13

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

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

     

     

     

     


    最新回复(0)