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 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 QDrag 实现拖动排序逻辑的简单示例: ```cpp #include <QtWidgets> class MyItemWidget : public QLabel { public: MyItemWidget(int index, QWidget *parent = nullptr) : QLabel(parent), itemIndex(index) { setText(QString("Item %1").arg(itemIndex)); setAutoFillBackground(true); setAlignment(Qt::AlignCenter); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setStyleSheet("QLabel { background-color: lightblue; border: 1px solid black; }"); setAcceptDrops(true); } void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setData("application/x-myitemdata", QByteArray::number(itemIndex)); drag->setMimeData(mimeData); drag->setPixmap(QPixmap(":/icons/item.png")); drag->exec(Qt::MoveAction); } } void dragEnterEvent(QDragEnterEvent *event) override { if (event->mimeData()->hasFormat("application/x-myitemdata")) { event->acceptProposedAction(); } } void dropEvent(QDropEvent *event) override { if (event->mimeData()->hasFormat("application/x-myitemdata")) { QByteArray itemData = event->mimeData()->data("application/x-myitemdata"); int droppedIndex = itemData.toInt(); // 处理拖动排序逻辑 emit itemDropped(droppedIndex, itemIndex); event->acceptProposedAction(); } } signals: void itemDropped(int fromIndex, int toIndex); private: int itemIndex; }; class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { setWindowTitle("Item Sort Example"); QVBoxLayout *layout = new QVBoxLayout; QWidget *centralWidget = new QWidget; centralWidget->setLayout(layout); setCentralWidget(centralWidget); for (int i = 0; i < 5; ++i) { MyItemWidget *itemWidget = new MyItemWidget(i); layout->addWidget(itemWidget); connect(itemWidget, &MyItemWidget::itemDropped, this, &MainWindow::handleItemDropped); } } private: void handleItemDropped(int fromIndex, int toIndex) { // 处理拖动排序逻辑,例如交换 item 的位置等 QWidget *centralWidget = this->centralWidget(); QLayout *layout = centralWidget->layout(); QLayoutItem *fromItem = layout->takeAt(fromIndex); QLayoutItem *toItem = layout->takeAt(toIndex); layout->insertItem(toIndex, fromItem); layout->insertItem(fromIndex, toItem); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载图标资源 QPixmap::fromImage(QImage(":/icons/item.png")); MainWindow mainWindow; mainWindow.show(); return app.exec(); } ``` 在这个示例中,我们创建了一个简单的主窗口,其中包含了 5 个可拖动的 item。当拖动一个 item 到另一个 item 上时,会发出 `itemDropped` 信号,并在 `MainWindow` 的槽函数 `handleItemDropped` 中处理拖动排序逻辑。通过交换 item 在布局中的位置,实现了拖动排序的效果。 注意:这个示例是一个最简单的实现,仅用于演示拖动排序的基本思路。在实际应用中,你可能需要根据自己的需求进行适当的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值