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

在pyqt中拖动画布时,将画布绑定到窗口

在pyqt中拖动画布时,可以将画布绑定到窗口上,以实现拖动的效果。以下是一个完善且全面的答案:

在pyqt中,可以使用QGraphicsView和QGraphicsScene来创建一个画布,并将其绑定到窗口上。QGraphicsView是一个用于显示QGraphicsScene的窗口部件,而QGraphicsScene则是一个用于管理和渲染图形项的场景。

首先,需要导入相应的模块:

代码语言:python
复制
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtCore import Qt

然后,创建一个继承自QGraphicsView的自定义视图类,并在其中初始化画布和场景:

代码语言:python
复制
class CanvasView(QGraphicsView):
    def __init__(self):
        super().__init__()
        
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)

接下来,可以在窗口的初始化方法中创建并设置这个自定义视图类的实例:

代码语言:python
复制
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.canvas = CanvasView()
        self.setCentralWidget(self.canvas)

现在,可以在画布上添加一些图形项,例如一个矩形:

代码语言:python
复制
rect = self.canvas.scene.addRect(0, 0, 100, 100)

为了实现拖动的效果,可以重写自定义视图类的mousePressEvent、mouseMoveEvent和mouseReleaseEvent方法:

代码语言:python
复制
class CanvasView(QGraphicsView):
    def __init__(self):
        super().__init__()
        
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)
        
        self.dragging = False
        self.last_pos = None
    
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            item = self.itemAt(event.pos())
            if item is not None:
                self.dragging = True
                self.last_pos = event.pos()
    
    def mouseMoveEvent(self, event):
        if self.dragging:
            delta = event.pos() - self.last_pos
            self.last_pos = event.pos()
            self.scene.setSceneRect(self.scene.sceneRect().translated(delta.x(), delta.y()))
    
    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.dragging = False

最后,可以在主程序中创建一个QApplication实例,并显示窗口:

代码语言:python
复制
if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

这样,就实现了在pyqt中拖动画布时将画布绑定到窗口的功能。

推荐的腾讯云相关产品:腾讯云服务器(CVM)和腾讯云对象存储(COS)。

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

相关·内容

测试之路 pytest接口自动化框架扩展-GUI窗口

想到界面就想到了窗口,于是就从网上搜索了pyqt5与python自带的tkinter的教程。...我当前的需求就是简单实现一个窗口录入文件,然后调用脚本执行方法即可。最后把结果显示一个对话框。使用pyqt5一是有点大材小用,二是学习成本会有点高。...这个方法可以看做死循环,可以对画布的操作重复无数遍。指导你退出程序。就如同我们使用软件一样。所有软件都是重复使用的,不可能只操作一次就退出了。...添加一个按钮画布 def onclick(): print("别点我!")...text_area.insert(INSERT, content) # 插入文本后需要更新一下组件 text_area.update() root.mainloop() Scrollbar:文本滚动条 command:滚动条拖动的回调监听

2.8K30

【Java AWT 图形界面编程】使用鼠标滚轮放大缩小 Canvas 画布 ( 鼠标滚轮事件监听器 MouseWheelListener )

1.0 设置鼠标滚轮监听 , Canvas 组件 , 调用 addMouseWheelListener 函数 , 添加 鼠标滚轮监听器 MouseWheelListener , 实现该监听器的...// 绘制图形 } } 二、绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放示例 ---- 【Java AWT 图形界面编程】Canvas 绘制超大图片 ( 使用鼠标拖动查看全图...| 设置 JFrame 窗口自动关闭 | 获取并绘制图片 | 鼠标拖动计算位移 | 画布偏移 ) 博客 , 绘制了超大图像 , 可以使用鼠标拖动 , 这里在上述基础上 , 新增鼠标滚轮缩放示例 ;...// 滚动布局放入窗口 frame.getContentPane().add(scrollPane); // 窗口自适应 frame.pack();...// 窗口设置可见 frame.setVisible(true); } } 2、效果展示 程序运行后默认效果 : 使用鼠标滚轮缩小画布 : 拖动缩小后的画布中央位置

2.2K30

【Java AWT 图形界面编程】Canvas 绘制超大图片 ( 使用鼠标拖动查看全图 | 设置 JFrame 窗口自动关闭 | 获取并绘制图片 | 鼠标拖动计算位移 | 画布偏移 )

一、Canvas 绘制超大图片要点 ---- 1、设置 JFrame 窗口自动关闭 创建 JFrame 窗口后 , 通过调用 JFrame#setDefaultCloseOperation 可以设置窗口自动关闭...关闭窗口并退出应用 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 2、获取并绘制图片 AWT , 使用 Toolkit.getDefaultToolkit..., 记录 移动后的位置 与 当前 ( startX , startY ) 位置 的差值 , 该差值累加到 ( startX , startY ) 坐标 ; 计算一个 Canvas 的画布偏移量 (...0 , 但是 鼠标不断拖动的过程 , 偏移量 ( offsetX , offsetY ) 一直累加 , 每次累加 , 都要重绘画布 , 重绘 , 调用 Graphics2D#translate...// 滚动布局放入窗口 frame.getContentPane().add(scrollPane); // 窗口自适应 frame.pack();

1.3K20

PyQt5入门教程

已经Python3.5版本从PyQt5转移到了tools,因此我们还需要安装pyqt5-tools pip install pyqt5-tools 1 这一步,PyQt5就安装完成了,你可以通过下面若干可选的操作来检查是否已经安装成功...1)添加文本 左侧的“Widget Box”栏目中找到“Display Widgets”分类,“Label”拖拽屏幕中间的“MainWindow”画布上,你就获得了一个仅用于显示文字的文本框,如下图所示...5)编辑菜单栏 注意画布的左上方有个“Type Here”,双击它即可开始编辑菜单栏。菜单栏支持创建多级菜单以及分割线(separator)。我随意创建了一些菜单项目,如下图所示。...点击画布空白处,然后在上方工具栏找到grid layout或者form layout,本例我们使用grid layout。两种layout的图标如下图所示。...本文中设计的程序/assets/code/pyqt5。 那么,就先写到这里了!

3.5K40

【Java AWT 图形界面编程】使用小键盘按键缩放 Canvas 画布绘制的背景图像 ( 键盘按键监听 + 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

-- 【Java AWT 图形界面编程】Canvas 绘制超大图片 ( 使用鼠标拖动查看全图 | 设置 JFrame 窗口自动关闭 | 获取并绘制图片 | 鼠标拖动计算位移 | 画布偏移 ) 博客..., 绘制了超大图像 , 可以使用鼠标拖动 ; 【Java AWT 图形界面编程】使用鼠标滚轮放大缩小 Canvas 画布 ( 鼠标滚轮事件监听器 MouseWheelListener ) 博客..., 新增鼠标滚轮缩放画布示例 , 但是使用鼠标拖动 , 拖动的效果也随之缩放, 如 缩小画布后 , 移动鼠标 , 移动距离对应的缩放效果也随之缩小 ; 【Java AWT 图形界面编程】使用鼠标滚轮放大缩小...// 滚动布局放入窗口 frame.getContentPane().add(scrollPane); // 窗口自适应 frame.pack();...(frame); } } 2、执行效果 执行后 , 图像船头的 H 标识放置界面中心 ; 鼠标指针放在 H 位置 , 点击一次 , 按下数字键 9 , 放大 9 倍的效果如下 :

1.8K20

PyQt5(designer)入门教程

PyQt5入门教程 2019/12/11更新:我平时不看CSDN的,之前一兴起发了过来,没想到反响还不错。...已经Python3.5版本从PyQt5转移到了tools,因此我们还需要安装pyqt5-tools pip install pyqt5-tools 这一步,PyQt5就安装完成了,你可以通过下面若干可选的操作来检查是否已经安装成功...1)添加文本 左侧的“Widget Box”栏目中找到“Display Widgets”分类,“Label”拖拽屏幕中间的“MainWindow”画布上,你就获得了一个仅用于显示文字的文本框,如下图所示...点击画布空白处,然后在上方工具栏找到grid layout或者form layout,本例我们使用grid layout。两种layout的图标如下图所示。...本文中设计的程序/assets/code/pyqt5。 那么,就先写到这里了!

2.3K10

python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析

的save()函数QPainter所使用的绘图指令保存在文件 QBitmap 是一个继承自QPixmap的简单类,它提供了1bit深度的二值图像的类,QBitmap提供的单色图像,可以用来制作游标(...) # 让前一个坐标值等于后一个坐标值, # 这样就能实现画出连续的线 self.lastPoint = self.endPoint painter = QPainter(self) #绘制画布窗口指定位置处...这样就能实现画出连续的线         self.lastPoint = self.endPoint         painter = QPainter(self)         #绘制画布窗口指定位置处...,并更新绘制,注意,这里的button()函数可以获取鼠标指针移动过程按下的所有按键,然后用Qt.LeftButton来判断是否按下了左键,mouseMoveEvent()必须使用该函数来判断按下的鼠标按键...也会进行绘制,现在运行程序,按下鼠标左键白色画布上进行绘制,实现了简单的涂鸦板功能 本文介绍了PyQt5利用QPixmap,QImage,QPicture,QBitmap实现简单画板的实例,更多关于PyQt5

1.3K31

python实现无边框进度条的实例代码

本文旨在用python实现无边框的进度条,并在其基础上加了图片,体现了某程序加载动画的效果 实现说明 1.进度条的部分用到了tkinter画布组件 2.图片无边框显示用到了PYQT5的QMainWindow..., QApplication (由于水平有限,只好用两个不同的库来实现) 源代码 import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import...(Qt.FramelessWindowHint) #子窗口窗口无按钮 ,但有标题,可注释掉观察效果self.setWindowFlags(Qt.SubWindow) self.setObjectName...root = Tk() #画布位置控制,前两个参数为宽度和高度,后两个参数为xy坐标root.geometry("480x30+720+830")#创建画布frame = Frame(root).grid...到此这篇关于python实现无边框进度条的实例代码的文章就介绍这了 ?

1K20

Android实现通话最小化悬浮框效果

大家使用主流的视频软件以及直播软件的时候,经常会看到打开视频最小化以后,不是直接关闭,而是屏幕右下角一个小窗口的样子,本次小编就给大家带来的是用Android实现在视频或者语音通话的时候,最小化也是出现一个悬浮框的效果...这里我把悬浮框的实现方法写在一个服务Service里面,悬浮框的开启关闭与服务Service的绑定解绑所关联起来,开启服务即相当于开启我们的悬浮框,解绑服务则相当于关闭关闭的悬浮框,以此来达到更好的控制效果...悬浮框成功被初始化以及相关参数被设置后,接下来就需要将对方的视频画布添加到悬浮框里面去了,这样我们才能看到对方的视频画面嘛,同样我们是Service的oncreate这个生命周期完成这个操作的,这里视频画布的添加方式使用的网易云信的...我们上面说到要将服务service的绑定与解绑与悬浮框的开启和关闭相结合,所以既然我们服务的oncreate()方法开启了悬浮框,那么就应该在其ondestroy()方法对悬浮框进行关闭,关闭悬浮框的本质是将相关...view给移除掉,接着清除我们的视频画布服务的ondestroy()方法执行如下代码: @Override public void onDestroy() { super.onDestroy();

2.5K50

【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

一、鼠标滚轮缩放的中心点设置为当前鼠标中心点 - 要点分析 ---- 鼠标指针指向界面的 Canvas 画布某个位置 , Canvas 画布绘制着一张超大图片 , 以该位置为中心 , 滑动鼠标滚轮进行缩放...; 使用鼠标滚轮缩放后 , Canvas 绘制的图片的尺寸肯定是放大或者缩小了 , 尺寸发生了改变 ; 图片缩放 , 鼠标指针指向一个位置 , 该位置对应着一个当前 Canvas 画布的 x..., 保存当前的鼠标位置及比例 ; 鼠标滚轮事件 MouseWheelEvent , 可以直接通过调用 e.getX(), e.getY() 获取到当前 鼠标指针 Canvas 画布的坐标 ;...// 滚动布局放入窗口 frame.getContentPane().add(scrollPane); // 窗口自适应 frame.pack();...// 窗口设置可见 frame.setVisible(true); } } 2、执行效果 执行后 , 图像船头的 H 标识放置界面中心 ; 鼠标指针放在

2.7K10

浅谈WPF之控件拖拽与拖动

使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布左侧图形库的图标控件拖拽右侧画布,就会生成一个新的控件,并且可以自由拖动。...控件拖动,当图标库的图标拖拽画布容器后,就会生成一个新的控件,通过属性按下事件,鼠标移动事件,鼠标升起事件,来实现控件的拖动。 实现步骤 1....,为图标库的图标绑定了MouseLeftButtonDown事件命令,当鼠标左键按下触发对应的事件,并开始拖拽。...第三个参数是拖拽效果 画布容器松开拖拽的鼠标左键,触发画布Drop事件,在此事件创建新的控件,如下所示: private ICommand canvasDropCommand; public...即在MouseDown开始,MouseMove不断设置控件的Left,Top的值随鼠标而动,MouseUp停止。

30110

PS基础操作及常用快捷键

PS界面 窗口菜单:管理(显示/隐藏)工具栏、属性栏、面板 ps界面恢复初始状态:窗口——工作区——复位基本功能 自定义窗口设置,如:把调整和样式合并到一个窗口下,把常用的字符界面窗口调到侧边...打开,菜单“文件”——“打开”——选择要打开的文件 ps外部找到要打开的图片,拖拽图片ps菜单栏的后方 PS保存的格式 .psd格式:ps,软件的源文件格式,画质最好,保留了图层信息,方便调整修改...,鼠标移动到选框范围内,按住左键拖动 精确选框绘制:属性栏——样式“固定大小”,输入具体尺寸,画布单击鼠标 固定比例:可以让选框始终按照一个比例进行绘制 案例1:把下图设置成望远镜的视角...首先新建图层,填充前景色为黑色,再用选图工具 注意:画好一个圆形图形,del掉,再鼠标直接拖动蚂蚁线的同时按住shift键移动,这样两个圆形就会处在同一水平线上。 ?...常用快捷键 快捷键 功能 Ctrl+N 新建画布 Ctrl+shift+alt+n 新建图层 Ctrl+alt+z 撤销(操作错了返回上一步) Alt+鼠标滚轮滚动 放大/缩小画布的显示效果 画布显示比工作区大

1.8K10

Canvas鼠标滚轮缩放以及画布拖动(图文并茂版)

Canvas鼠标滚轮缩放以及画布拖动 本文会带大家认识Canvas中常用的坐标变换方法 translate 和 scale,并结合这两个方法,实现鼠标滚轮缩放以及画布拖动功能。...事件坐标系 构造函数添加对 Canvas 的 mousedown 事件监听,记录点击鼠标相对屏幕的位置 x 和 y。...为了避免上述问题的出现,最好的解决办法就是 Sence 类的构造函数重新绑定 this 指向。...的渲染上下文已经经过了变换,那么使用 clearRect 清空画布前,需要先重置变换,否则 clearRect 无法有效地清除整块画布。...这个时候就会存在一个问题,我们 A 点进行放大,放大后得到的 A' 的位置应该是不变的,所以需要在放大之后需要调整 A’ 点的位置 A 点。

1.7K10

【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照

大话 IVX 实战到精通 一、画布和图片序列 iVX 画布是用于对图像进行灵活编辑的组件,若你需要对图片进行融合,那么使用画布是你最优的选择。...1.1 图片序列 图片序列位于组件面板图片右侧: 以相对定位应用为例,创建相对定位应用,应用添加一个页面,页面中点击图片序列即可添加;当点击图片序列后将会弹出资源选择窗口,只需要选择多张图片即可创建一个图片序列...,在这些关键帧为其制作动画: 接着可拖动时间轴为其添加关键帧: 不同的时间点打上关键帧后,如下图所示: 接着点击那些打上的关键帧改动其文本的位置或其他属性,以位置为例:...三、我和iVX的合照 第一点介绍了画布的作用,接下来咱们使用画布合成一张图片,并且下载到本地。...3.2 功能制作 需要自由的对图片进行合成,咱们对画布添加点击事件,点击画布即可选择本地支资源图片,咱们首先对画布添加事件: 以上事件,回调是指“某动作做完之后”需要做的事情,以上示例,读取完图片后

66740

python安装qt5_pycharm+QT5+python3安装与环境配置

MAC OS 10.12.3 版本 Pycharm 2016.3.2 版本 Python 3.6.0 版本 PyQt5 5.8.1 版本 ( pyinstaller:python代码打包为可执行的exe...方式二:pycharm安装 方式三:使用Homebrew brew install pyqt 方式四:手动编译安装 注意: 到此为止其实已经可以开发了,但是我们想要更爽的开发,可以直接拖动控件,所以需要...注意: 这里需要安装的都安装完成了,下面需要把所以安装的东西配置起来。 配置QtDesigner 可视化的拖控件写UI,一个字爽!...我们创建窗口程序,选择Man Window,让后点击create。 点击create后,会出现画布和控件 拖动一个文本写点内容: 保存布局文件。...选择保存路径 此时项目下可以看到这个文件了。 但是这个文件python不能直接运行啊,咋办? 此时需要我们上面配置的另一个工具了PyUIC。

2.9K40

从01开发可视化数据大屏(下)

但是当父组件的传值是数组或者对象,子组件不仅能够直接修改,还不会报错,子组件改变这个对象或数组本身将会影响父组件的状态。...原因是:父组件传递给子组件的,实际上只是一个引用地址,当子组件修改这个对象,是真的修改了堆空间中保存的数值,当然父组件的值也会发生变化,但是引用地址没有进行修改 1.2 数据源配置模块 ❝通常我们数据管理是用来配置控件诸如图表的数据...,同步数据响应结果面板,最终展示控件画布区域视图的变更。...❞ 答:我们是通过数据源的dataSourceUrl以及轮训时间间隔等配置绑定控件属性,然后当用户从编辑模式切换到全屏预览模式下,再发出请求,大致原理参考如下? ? image.png ?...❞ 答:图层本质上也是支持上下拖拽移动的,同样也是基于vuedraggable, 但是不同的是,当拖动上下层级的,会影响z-index的改变,也就是设置元素的堆叠顺序(来调整画布控件的堆叠顺序)实现如下

1.9K10

【iVX 初级工程师培训教程 10篇文拿证】05 画布及飞机大战游戏制作

11.1.1 完成游戏角色制作 首先我们创建一个微信 2D小游戏: 创建好游戏场景后游戏界面可以添加图片,作为游戏中的元素。点击图片组件画布绘制一个主角飞机。...点击图片后画布拖动鼠标绘制区域后将会弹出资源选择框: 选中我们需要添加的图片素材后,此时画布中就会出现主角飞机图片: 我们点击图片,拖拽合适大小: 11.1.2 完成物理世界添加 为了方便之后飞机与敌机之间检测物理碰撞...在对象树种点击飞机图片组件,左侧组件栏中点击物体进行添加: 此时我们通过 web 浏览器进行调试,点击预览: 为了更好的方便观察,我们在出现的浏览器窗口中按下 F12,选择该窗口为手机浏览器窗口:...接下来创建一个变量记录击落敌机数量: 子弹触碰到敌机时该数值加一: 我们在前台创建一个文本命名为击落,用于显示该变量值并且设置初始文本为 0: 之后子弹触碰敌机时添加一个动作,显示该变量的内容...最终考虑用户体验,我们停止后再显示一个游戏结束文本。在前台中添加一个文本命名为游戏结束,默认为不可见: 敌机触碰到主角添加游戏结束文本显示操作即可:

89920

低代码设计器的自由布局拖动的实现原理

: dragenter:拖拽元素目标上触发 dragover:拖动元素目标元素,持续触发 dragleave:离开目标元素触发 drop:拖放元素到了目标元素松开鼠标触发 拖动放置行为 拖动事件...拖动元素目标元素松手添加元素画布,即将组件元数据添加到list2,元素所对应的元数据记录也了这个组件画面的坐标位置。 然后dragend事件取听以上动作。...$refs.targetContent.addEventListener("dragleave", this.dragleave); // 拖动元素目标元素松手添加元素画布 this....同样,我们可以画布的组件添加mousedown事件,事件我们添加mousemove事件的监听,当画布的组件进行移动,我们实时的将该被移动元素所对应的元数据坐标进行更新。下面是代码的实现。...$refs.targetContent.addEventListener("dragleave", this.dragleave); // 拖动元素目标元素松手添加元素画布

3.9K30
领券