首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

创建鼠标事件后保留QGraphicsItem多选移动

在使用Qt框架进行图形界面开发时,可以通过创建鼠标事件来实现保留QGraphicsItem的多选移动功能。下面是一个完善且全面的答案:

鼠标事件是指在用户与计算机交互时,通过鼠标设备产生的各种事件。在Qt中,可以通过重写QGraphicsView的鼠标事件函数来实现对鼠标事件的响应和处理。

要实现保留QGraphicsItem的多选移动功能,可以按照以下步骤进行:

  1. 创建一个自定义的QGraphicsView类,并重写其鼠标事件函数。
代码语言:txt
复制
class CustomGraphicsView : public QGraphicsView
{
    Q_OBJECT

public:
    CustomGraphicsView(QWidget* parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;

private:
    bool m_isMoving;
    QList<QGraphicsItem*> m_selectedItems;
    QPointF m_lastPos;
};
  1. 在构造函数中初始化成员变量。
代码语言:txt
复制
CustomGraphicsView::CustomGraphicsView(QWidget* parent)
    : QGraphicsView(parent), m_isMoving(false)
{
    setDragMode(QGraphicsView::RubberBandDrag);
}
  1. 重写鼠标事件函数,实现多选移动功能。
代码语言:txt
复制
void CustomGraphicsView::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        QGraphicsItem* item = itemAt(event->pos());
        if (item && item->isSelected())
        {
            m_isMoving = true;
            m_selectedItems = selectedItems();
            m_lastPos = event->pos();
        }
    }

    QGraphicsView::mousePressEvent(event);
}

void CustomGraphicsView::mouseMoveEvent(QMouseEvent* event)
{
    if (m_isMoving)
    {
        QPointF delta = event->pos() - m_lastPos;
        for (QGraphicsItem* item : m_selectedItems)
        {
            item->moveBy(delta.x(), delta.y());
        }
        m_lastPos = event->pos();
    }

    QGraphicsView::mouseMoveEvent(event);
}

void CustomGraphicsView::mouseReleaseEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_isMoving = false;
        m_selectedItems.clear();
    }

    QGraphicsView::mouseReleaseEvent(event);
}

以上代码中,重写的鼠标事件函数中,首先判断鼠标按下的按钮是否为左键,然后判断鼠标点击的位置是否有选中的QGraphicsItem。如果有选中的项,则将其标记为正在移动状态,并记录选中的项、鼠标按下的位置。

在鼠标移动事件中,如果处于移动状态,则计算鼠标移动的偏移量,并将选中的项按照偏移量进行移动。

在鼠标释放事件中,如果释放的按钮是左键,则将移动状态标记为结束,并清空选中的项。

通过以上步骤,就可以实现保留QGraphicsItem的多选移动功能。

在腾讯云的产品中,与图形界面开发相关的产品有云服务器、云数据库MySQL版、云存储COS等。您可以根据具体需求选择适合的产品。以下是相关产品的介绍链接地址:

  • 云服务器:https://cloud.tencent.com/product/cvm
  • 云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 云存储COS:https://cloud.tencent.com/product/cos

请注意,以上答案仅供参考,具体实现方式可能因项目需求和开发环境而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【QT】图形视图、动画框架

图形项可以处理键盘事件鼠标事件,如鼠标按下事件移动、释放及双击事件,还可以跟踪鼠标移动。...图形项支持如下功能: 鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件 键盘输入焦点和键盘事件 拖放事件 分组,使用QGraphicsItemGroup通过parent-child关系来实现。...所有的鼠标事件和拖放事件都是使用视图坐标来接收的。 图形视图框架的映射函数: 事件处理与传播 图形视图框架中的事件都是由视图进行接收的,然后传递给背景,再由背景传递给响应的图像项。...一个图像项可以接收悬停事件,当鼠标进入它的区域之中时,它就会收到一个QGraphicsSceneHoverEnter事件鼠标在图像项的区域移动时,QGraphicsScene就会向该图像项发送GraphicsSceneHoverLeave...事件,可通过QGraphicsItem::setAcceptHoverEvents()视图图像项接收悬停事件(默认不接收)。

1.4K30

基于Qt的流程设计器(一)

一:先来看一下界面的截图: 说明: 拖动节点的时候,与该节点相关的箭头连线也会跟着调整; 用户可以使用鼠标从一个节点拖出一个箭头到另一个节点(鼠标在空白区域点击一下,拖出的箭头消失) 这三个图标,手型图标处于选中状态的时候...,节点可以拖动, 箭头图标处于选中状态的时候,可以使用鼠标绘制连线箭头 最后一个图标,用于在画布上创建一个节点方框 二: 关键代码文件如下图(用红框框住的为关键代码文件) 其他文件均为辅助代码文件(有些文件中的代码没有用到...是QGraphicsItem的虚函数,必须要实现, 其中1.5是箭头连线的线宽,8是箭头张开所占的区域宽度 p1是箭头的起始点,p2是箭头结束点(也就是带箭头的那一端) 最终返回的一个Rect结构如下图所示...箭头只不过是一个多边形,用drawPolygon画出来的 七: CustomRect继承自QGraphicsRectItem 在这个类型中,我们重载了itemChange函数,代码如下 当当前方框节点移动...(后续会讲为什么要允许事件冒泡) 接下来执行了绘制箭头的逻辑,并在起始节点和结束节点分别记录了箭头的指针 以后这两个节点移动的时候,箭头也会跟着移动了。

1.5K60

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

qt中提供了QGphicsView,QGraphicsScene,QGraphicsItem,QGraphicsPixmapItem是QGraphicsItem的子类 分辨创建它们的实例:view,scene...,然后重写paint()、boundingRect()等方法,此外假设还想要获取鼠标事件,重写mousePressEvent等事件就好了,注意,一旦重写了mousePressEvent方法,就以为了qt...不会再自己主动处理item的不论什么press事件了,能够在你重写的mousePressEvent方法中最后加入�QGraphicsItem::mousePressEvent(event);解决问题,就是说你获取到了鼠标事件...,可是依旧让qt处理这个鼠标事件。...mainwindow.h与main.cpp是qt自己主动产生的代码,我没有产生窗体ui myscene.h与某与scene.cpp是定义了类MyScene,继承自QGraphicsScene,我的目的是要获取其鼠标事件

1.5K10

PyQt5中使用图元实现高效绘制场景

Qt图形视图框架组件 Qt图形视图框架是基于Model-View的架构实现的,主要包含三个相关Qt对象组件分别是: QGraphicsView QGraphicsScene QGraphicsItem...QGraphicsScene主要的功能有以下: - 负责检测图元对象是否重叠跟交会 - 负责图元选择与编辑管理 - 负责查找与发现图元对象跟位置 - 负责接受信号事件并传递给图元 Qt图形视图框架使用...基于Scene与View实现图元对象创建、绘制与显示、拖动支持。...# 线段 QGraphicsPathItem # 路径 QGraphicsPixmapItem # 图像 QGraphicsEllipseItem # 圆或者椭圆 下面的演示实现了图元绘制与Scene创建...main_win.setCentralWidget(myPanel) main_win.setMinimumSize(820, 620) main_win.show() app.exec() 运行结果演示(图元3 支持鼠标选择与拖动

9010

PyQt5 图形项的定义和交互(一)

如果创建一个自定义的窗口部件并重新实现它的绘制事件,就可以得到任何想要的图形。但如果需要绘制大量的单个项,或者是需要绘制用户能够进行单独交互的项(例如选中、移动、复制粘贴...)...,又或者需要对项进行动画处理,使用PyQt的图形视图类(QGraphicsView)比重新实现一个窗口部件的绘制事件更方便一些。 要使用图形视图类就必须创建一个场景(QGraphicsScene)。...__init__(text) #设置图形项为 可选中、可移动 self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable...__init__() #属性设为可选、可移动、可聚焦 self.setFlags(QGraphicsItem.ItemIsSelectable|...self.removeBorders()#打印前清除边框 self.scene.render(painter) self.addBorders()#打印恢复边框

1.8K40

QT实现机器视觉最常用的图像查看器(源码)

这种方式如果你仅仅是想实现图像的显示,那很简单,直接将图像放到QLabel里就可以了,但如果你还想实现图像放大缩小平移查看等功能,就需要自己重写各类鼠标事件,处理复杂的逻辑。...调用也很简单,如下所示: //创建Scene QGraphicsScene* pScene = new QGraphicsScene(this); //创建View并为其绑定Scene QGraphicsView...所以想实现我们文章开头的预期效果,并不是这么几行就可以搞定的,我们需要重写QGraphicsView类,实现我们预期的自定义功能,例如双击鼠标事件,背景绘制等等。...} } CustomGraphicsView::~CustomGraphicsView() { } bool CustomGraphicsView::InitWidget() { //创建变量对象...m_Image.height(); m_pImageItem->setPixmap(m_Image); fitFrame(); onCenter(); show(); } //重写鼠标滚轮滚动的事件函数

21910

(10月最新) 前端图形学实战: 从零开发几何画板(vue3 + vite版)

鼠标在画布里拖动即可创建任意大小比例的图形, 为了实现这一效果, 我们需要做如下准备: 定义图形的schema结构 根据鼠标光标的位置计算图形创建的元信息(图形id, 顶点坐标, 宽高样式等属性) 1...根据鼠标光标的位置计算图形创建的元信息 我们都知道, 要想通过鼠标拖动来创建任意一个矩形, 我们需要知道几个条件: 鼠标按下的初始点的坐标 鼠标拖动过程中的实时位置 这两个问题其实都可以在全局实现, 基于组件设计的原子化原则..., 让外部可以拿到内部是事件运行时 我们使用 useMouse 的时候就可以实时拿到鼠标的x, y的绝对坐标, 再减去画布在页面的实际偏移cardOffset.x, cardOffset.y, 就可以得出鼠标在画布中正确的坐标...这里顺便扩展一下, 我们平时看到的拖拽框架, 对组件进行多选操作时也用了同样的方式, 通过鼠标拖拽滑动来产生多选区域: 2022-10-15 20.20.10.gif 感兴趣的朋友可以把这个方案进行扩展...移动, 编辑几何图形 有了上面创建元素的基础, 我们继续来实现移动和编辑元素的功能。

78420

软件测试|超好用超简单的Python GUI库——tkinter(十三)

前言 我们之前介绍了tkinter的单选框与多选框,单选框和多选框在我们日常生活中有很广泛的使用,我们还可是以音乐播放软件举例,音量调节不是通过我们输入来调节,而是以这样的滑块来滑动。...默认值是 100(毫秒) resolution 指定 Scale 组件的分辨率(每点击一下移动的步长) 示例: 比如 resolution 选项设置为 0.1 的话,那么每点击一下鼠标就是在 0.0 ~...20.0 之间以 0.1 的步长移动 2....默认值是 30 像素 state 默认情况下 Scale 组件支持鼠标事件和键盘事件,可以通过设置该选项为 DISABLED 来禁用此功能 2....当滑块移动的时候,该变量的值也会发生相应的变化 width 指定 Scale 组件的宽度2.

63720

图形编辑器开发:最基础但却复杂的选择工具

选择工具,主要是用来选择,选中一个很普遍的操作是:移动选中元素。...所以这也是它有时候也被叫做 移动工具 的原因。 移动的交互过程: 光标停留在已经被选中的图形上,按下鼠标不放; 然后拖拽鼠标,被选中图形跟随光标移动; 释放鼠标,表示移动到目标位置,移动结束。...// 图形移动前位置 let elStartCoords = []; // 鼠标按下事件的光标位置,计算偏移量时作为基准 let startCoord = { x: undefined, y: undefined...要点: 拖拽的中途从没按住 Shift 到按住,要立即响应,代码实现上要补一个键盘事件监听,而不是靠鼠标移动事件,因为你不移动鼠标,被选中元素就不会更新。 比较 dx 和 dy 的大小。...dx 大,水平移动;dy 大,垂直移动。这样图形就能尽量靠近十字线(水平线+垂直线) 对齐到像素网格 对齐到网格,开启,让图形在移动的时候,让图片尽量贴到网格线上。

27630

VCL 控件分类_验证控件的分类

:模态方式,非模态方式) Close(); (关闭窗体) (在Event 选项卡中) OnCreate(); 创建窗体是发生事件 OnShow(); 窗体显示时发生的事件 OnActive(); 窗体变为活动窗体时发生的事件...biHelp(帮助图标) Color : 背景颜色 BorderStyle:窗体外观与边界设置 Position:位置 Font:窗体中文字各个属性 Hint:窗体 Icon:窗体 ShowHint:鼠标移动到该组件上方时是否显示提示信息...(加速键是在该父菜单激活才能使用,快捷键则可以直接使用) BitMap:为菜单项加图标 右键 Insert From Template:快速使用模版创建菜单项 Frames 可用于组合多个控件,动态生成多个控件集合...TPopupMenu 创建完弹出菜单按钮和事件,将需要该菜单的控件的PopupMenu事件绑定该菜单 。...Columns:列表所显示的栏数 MultiSelect:是否支持多选 Sorted:是否按字母顺序进行排序 ItemIndex:列表中被选中选项的序号。

4.3K10

Python 学习之 Tkinter「下」

如果单击一个项目,然后拖动鼠标会跟随选中,是默认的。 2.SINGLE:和 BROWSE 的区别是你只能选择一行,不能拖动。...3.EXTENDED:通过 shift 和 control 可以使 ListBox 支持连选和多选,能拖动 4.MULTIPLE:支持连选和多选,但不能拖动 列表框 ListBox I # 创建一个...lb.selection_includes(1)) # 判断索引项是否被选中 效果图 列表框 ListBox II # 绑定变量 v = tkinter.StringVar() # SINGLE 与 BORWSE 相似,但是不支持鼠标按下后移动选中位置...取出元组类型的数据 ('green', 'blue', 'yellow', 'white') v.set(("one", "two", "three", "four")) # 设置元素值 # 绑定事件...1>', show) 效果图 列表框 ListBox III # EXTENDED 通过 shift 和 control 可以使 ListBox 支持连选和多选,MULTIPLE 支持连选和多选 lb

2K50

Vcl控件详解_c++控件

TTabControl 属性  DisplayRect:只定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化。...如果为True,是字会变成蓝色 Images:为每个页标签添加一个图片 MultiLine:如果总页标签的长度大于该控件的宽度时,是否允许多行显示 MultiSelect:是否允许多选页标签...OnCollapsing:折叠节点时触发 OnCompare:节点排序过程中,两个节点进行比较时触发 OnCreateNodeClass:创建一个新的节点时触发 OnCustomDraw...vsReport时才有效 SelCount:只读返回选择项目的个数 Selected:指出在该控件中选中的项目标注的列表视图项目 ShowColumnHeaders:是否显示列标题,使用Columns可创建和添加一个列标题...OnDrawPanel:当面板需要重新绘制时触发 OnCreatePanelClass:当一个面板需要创建时触发 OnHint:当显示提示时触发 TToolBar 属性 ButtonCount

4.8K10

FL Studio21最新中文版本全新功能详细介绍

zoneid=41402项目文件夹(Project Folders)-在“选项 > 常规设置”下的选项,创建或保存新项目时可以打开“新项目”窗口(可选显示)。...播放列表和钢琴卷帘窗(Play list & Piano roll)-使用Select > overlapping 音符选项可删除重合部分,删除顶层音符,只保留最底层的音符。...06浏览器(改进)标签(Tags)-单击标签(底部)打开更多选项。偏好(Favoriting)-单击鼠标切换内容上的星号。...mid MIDI文件被标记为“score”选项卡(Tabs)-新(右击)选项卡选项,以向左/向右移动浏览器选项卡。增加“克隆此选项卡”选项。...编辑(同步回放)-将播放起始处重新定位到播放列表、钢琴窗和事件编辑器中的任何位置。

3.7K20

Python 学习之 Tkinter「下」

如果单击一个项目,然后拖动鼠标会跟随选中,是默认的。 2.SINGLE:和 BROWSE 的区别是你只能选择一行,不能拖动。...3.EXTENDED:通过 shift 和 control 可以使 ListBox 支持连选和多选,能拖动 4.MULTIPLE:支持连选和多选,但不能拖动 列表框 ListBox I # 创建一个 listbox...列表框 ListBox II # 绑定变量 v = tkinter.StringVar() # SINGLE 与 BORWSE 相似,但是不支持鼠标按下后移动选中位置 lb = tkinter.Listbox...取出元组类型的数据 ('green', 'blue', 'yellow', 'white') v.set(("one", "two", "three", "four")) # 设置元素值 # 绑定事件...列表框 ListBox III # EXTENDED 通过 shift 和 control 可以使 ListBox 支持连选和多选,MULTIPLE 支持连选和多选 lb = tkinter.Listbox

2.2K20
领券