QDrag 使用一例

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

 欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

   在Qt中可以使用QDrag 来拖动操作Graphics各个元素,以此实现方便的拖动操作。

我们可以从QGraphicsItem 重载 mousePressEvent 来做开始拖动的操作,比如

Cpp代码   收藏代码
  1. void Item::mousePressEvent(QGraphicsSceneMouseEvent *event){  
  2.     Qt::MouseButtons btn = event->buttons();  
  3.     if(btn == Qt::LeftButton){  
  4.   
  5.         QDrag* drag = new QDrag(this->scene());  
  6.   
  7.         QMimeData* data = new QMimeData();  
  8.         drag->setMimeData(data);  
  9.   
  10.         QPixmap pixmap(":image.png");   
  11.         QPainter painter(&pixmap);  
  12.   
  13.         drag->setPixmap(pixmap); //这里设置拖拽时跟随鼠标的图片  
  14.         drag->setHotSpot(QPoint(15,15)); //设置跟随图片的中心点  
  15.   
  16.         drag->exec();   //开始拖拽, 释放拖拽执行下面代码  
  17.         #ifdef Q_WS_WIN     //linux系统中你不能删除drag,删除会由系统自动执行(自己调试得知,可能不正确)  
  18.              delete drag;//注意 上面QMimeData* data这里也会一并删除  
  19.          #endif  
  20.   }  
  21. }  

 这样当我们鼠标按下这个Item时候 拖动就可以开始了

我们有了可以拖的,还必须有去接收这个拖拽的东西,因为只有定义了允许放东西的地方。你才能把东西放里面

于是我们重载另一QGraphicsItem 的dropEvent函数

拖拽接收方代码   收藏代码
  1. void DragReceiverItem::dropEvent(QGraphicsSceneDragDropEvent *event)  
  2. {  
  3.       
  4.     qDebug() << "drop event " ;  
  5.     qDebug() << "pos =  " << event->pos();  
  6.     qDebug() << "scene pos = " << event->scenePos();  
  7.     qDebug() << "screen pos = " << event->screenPos();  
  8.     qDebug() << "mime data = " << event->mimeData();  
  9.       
  10. }  

 可以看到 mimeData也会随着 QGraphicsSceneDragDropEvent传递过来,这样拖拽就可以传递一些我们自己的数据。

还有一点要注意,就是QGraphicsItem必须设置 accpetDrop 为true之后才能触发DropEvent等事件

然后我们还有很多地方可以定制,比如

Cpp代码   收藏代码
  1. void DragReceiverItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)  
  2. {  
  3.     qDebug() << "拖到 当前Item里面时";  
  4. }  
  5.   
  6. void DragReceiverItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)  
  7. {  
  8.     qDebug() << "拖到当前item外面时";  
  9. }  
  10.   
  11. void DragReceiverItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event)  
  12. {  
  13.     qDebug() << "拖到当前item里面的移动时";  
  14. }  
 

综上,我们拖拽操作的拖动方与接收方都定义好了,我们就可以方便的在Qt Graphics中使用拖拽操作了。

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

你可能感兴趣的:(qt)