程序运行截图如下:

程序很简单,有个坑,如下:

QGraphicsScene要经过

dragMoveEvent(QGraphicsSceneDragDropEvent *event)

才能触发这个

dropEvent(QGraphicsSceneDragDropEvent *event)

程序结构如下:

源代码如下:

mygraphicsscene.h

#ifndef MYGRAPHICSSCENE_H
#define MYGRAPHICSSCENE_H#include <QObject>
#include <QGraphicsView>
class MyGraphicsScene : public QGraphicsScene
{Q_OBJECT
public:MyGraphicsScene(QWidget *parent=0);~MyGraphicsScene();void createRect(const QPointF &pt);void createLine(const QPointF &pt);protected:void dragEnterEvent(QGraphicsSceneDragDropEvent *event);void dropEvent(QGraphicsSceneDragDropEvent* event);void dragMoveEvent(QGraphicsSceneDragDropEvent *event);private:QGraphicsScene *m_scene;
};#endif // MYGRAPHICSSCENE_H

mylistwidget.h

#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H#include <QObject>
#include <QListWidget>class MyListWidget:public QListWidget
{Q_OBJECT
public:MyListWidget(QWidget *parent=0);~MyListWidget();protected:void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);private:QPoint m_dragPosition; // 拖放起点QListWidgetItem *m_dragItem; // 被拖放的item
};#endif // MYLISTWIDGET_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class MyGraphicsScene;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;MyGraphicsScene *m_scene;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

mygraphicsscene.cpp

#include "mygraphicsscene.h"
#include <QDebug>
#include <QMimeData>
#include <QGraphicsSceneDragDropEvent>
#include <QGraphicsLineItem>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QPen>MyGraphicsScene::MyGraphicsScene(QWidget *parent):QGraphicsScene(parent)
{}MyGraphicsScene::~MyGraphicsScene()
{}void MyGraphicsScene::createRect(const QPointF &pt)
{QGraphicsRectItem *item=new QGraphicsRectItem;item->setRect(pt.x(),pt.y(),18,50);item->setBrush(QBrush(Qt::red));item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);this->addItem(item);
}void MyGraphicsScene::createLine(const QPointF &pt)
{QGraphicsLineItem *item=new QGraphicsLineItem;item->setLine(pt.x(),pt.y(),pt.x(),pt.y()+56);item->setPen(QPen(Qt::red,5));item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);this->addItem(item);
}void MyGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{if(event->mimeData()->hasFormat("text/plain")){event->acceptProposedAction();}
}void MyGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{if (event->mimeData()->hasFormat("text/plain")){QString text=event->mimeData()->text();if(text=="矩形"){createRect(event->scenePos());}else if(text=="直线"){createLine(event->scenePos());}else{}event->acceptProposedAction();}
}void MyGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{event->accept();
}

mylistwidget.cpp

#include "mylistwidget.h"#include <QMouseEvent>
#include <QListWidgetItem>
#include <QDrag>
#include <QApplication>
#include <QMimeData>
#include <QPainter>
#include <QPixmap>MyListWidget::MyListWidget(QWidget *parent):QListWidget(parent)
{}MyListWidget::~MyListWidget(){}void MyListWidget::mouseMoveEvent(QMouseEvent *event){if(!(event->buttons()&Qt::LeftButton))return;if((event->pos()-m_dragPosition).manhattanLength()<QApplication::startDragDistance())return;if(!m_dragItem)return;QDrag *drag=new QDrag(this);QMimeData *mimeData=new QMimeData;mimeData->setText(currentItem()->text());drag->setMimeData(mimeData);if(mimeData->text()=="矩形"){QPixmap dragImg(18,50);QPainter painter(&dragImg);painter.setBrush(QBrush(Qt::red));painter.drawRect(0,0,18,50);drag->setPixmap(dragImg);}else if(mimeData->text()=="直线"){QPixmap dragImg(2,56);QPainter painter(&dragImg);painter.setPen(QPen(Qt::red,2));painter.drawLine(0,0,0,56);drag->setPixmap(dragImg);}else{}drag->exec(Qt::CopyAction|Qt::MoveAction);
}void MyListWidget::mousePressEvent(QMouseEvent *event){m_dragPosition=event->pos();m_dragItem=this->itemAt(event->pos());//保持父类继承下来的按键行为QListWidget::mousePressEvent(event);
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mygraphicsscene.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("CSDN IT1995");QStringList strList;strList.append("矩形");strList.append("直线");ui->listWidget->insertItems(0,strList);ui->listWidget->setDragEnabled(true);m_scene=new MyGraphicsScene;m_scene->setSceneRect(0,0,ui->graphicsView->width(),ui->graphicsView->height());ui->graphicsView->setScene(m_scene);}Widget::~Widget()
{delete ui;
}

Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene相关推荐

  1. Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene【补坑】【Qt视图框架补坑】

    关于以前的这篇博文,进行补坑 https://blog.csdn.net/qq78442761/article/details/80957186 坑的位置在这,采用上面这篇博文的配法,无法得到图元在场 ...

  2. Qt工作笔记-可拖动大小的QListWidget(自定义控件方式)

    运行截图如下: 代码如下: mylistwidget.h #ifndef MYLISTWIDGET_H #define MYLISTWIDGET_H#include <QObject> # ...

  3. Qt工作笔记-可拖动大小的QListWidget(使用QDockWidget)【QMainWindow与QWidget中的天坑】

    本次基本上没有代码,全是用designer搞出来的. QMainWindow设计图如下: 程序运行截图如下: 而使用QWidget呢. 界面如下: 此处的QDock是不能拖动的,在此不再用动态图演示

  4. Qt之QAbstractItemView视图项拖拽(二)

    一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...

  5. Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包

    原理以及运行 原理是因为QJsonDocument提供了一个函数toJson 可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容, ...

  6. Qt工作笔记-在QTreeView上实现模型数据的拖拽

    运行截图如下: 逻辑是: 1.QTreeView开发拖拽功能. 2.在自定义模型中重写 flags(const QModelIndex &index) const mimeData(const ...

  7. qt下实现文件的拖拽打开

    引言 此文用于记录按下鼠标左键不放,拖动文件到程序中打开.该示例中只设置了可以拖动的文件类型为.h,.cpp,.txt这三种文件类型. 程序运行的效果: 示例 下面是具体的实现. 项目的结构: 具体的 ...

  8. Qt工作笔记-MineData相关基本操作

    QMimeData类提为数据提供一个容器,用来记录关于MIME类型数据的信息 QMimeData常用来描述保存在剪切板里信息,或者拖拽原理 QMimeData对象把它所保存的信息和正确的MIME类型连 ...

  9. 原生JS 实现页面元素的拖动 拖拽

    1 . 实现原理 要实现页面元素的拖动,其原理就是根据鼠标的移动实时的更改元素的left 和 top值(当然元素肯定是要做绝对定位的),那么就达到我们要的效果了呀! 鼠标的位置是可以通过 e.clie ...

最新文章

  1. 20165320 第九周学习总结
  2. c语言 链表_C语言编程第22讲——单向有序链表的C语言实现
  3. android 报500是啥异常_一文领会Android消息系统的Message设计
  4. 多个线程对串口读取 modbus_看完这个,如果还不懂Modbus,那您去撞豆腐吧
  5. C++递归删除非空目录所有文件
  6. hdu 1718 Rank
  7. HEX文件解析C语言源代码
  8. ER图(实体关系图)怎么画?
  9. 省市县三级联动插件distpicker
  10. Android开发环境配置(内有完整过程配图)
  11. python从网页提取文本_使用Python进行网页正文提取
  12. 字段缩写ti表示什么_EBSCOhost数据库中,检索字段代码为TI、SO、AU分别表示
  13. 前端判断文件后缀名_JS - 获取文件后缀,判断文件类型(比如是否为图片格式)...
  14. 毕业设计c语言课程设计,毕业设计_c语言_课程设计.doc
  15. 如何解决EXCEL中弹出“信息检索”的信息
  16. 400. 第 N 位数字【我亦无他唯手熟尔】
  17. 嵌入式:Altium Designer18提升速度的操作(画开发板笔记)
  18. linux 安装谷歌浏览器--Google chrome
  19. 如何用python爬取参考文献的doi
  20. androidstudio 引入百度或者高德地图 鉴权失败

热门文章

  1. 5招训练你的数据敏感度,数据高手都在用
  2. 程序员如果想安身立命 什么情况????
  3. 【转载】送到榨油厂的飞鸽传书
  4. 努力的钻研深层次的【飞鸽传书】技术
  5. 面试题系列(7):线程与进程的区别是什么,简单说一下。
  6. css如何让不确定宽度的div水平居中
  7. 算法——贝叶斯公式的推导过程
  8. python 姓名用*替换_学会用python截取你的姓名
  9. SQLite | 数据库设计与 Creat Table 语句
  10. Logistic回归模型原理