低代码软件搭建自学第二天——构建拖拽功能

server/2024/12/25 14:19:58/

文章目录

  • 第 3 步:实现拖拽功能
    • 3.1 拖拽的基本概念
    • 3.2 创建基础拖拽界面
      • 代码示例:拖拽矩形
      • 运行结果:
    • 3.3 添加多个拖拽元素
      • 代码示例:多个拖拽元素
      • 运行结果:
    • 3.4 添加工具箱
      • 代码示例:工具箱 + 拖拽
      • 运行结果:
    • 3.5 画布缩放和平移
      • 代码示例:缩放和平移画布
      • 运行结果:
    • 下一步计划


继续学习 构建拖拽功能,这是类似 Visio 的核心功能,接下来学习如何实现 拖拽组件连线功能自由画布设计

第 3 步:实现拖拽功能

3.1 拖拽的基本概念

在 PyQt 中,可以通过 QGraphicsViewQGraphicsSceneQGraphicsItem 来实现拖拽和自由画布操作:

  • QGraphicsView:可视化窗口,用来显示画布。
  • QGraphicsScene:管理画布上的所有元素(图形、线条等)。
  • QGraphicsItem:画布上的每个图形元素(比如矩形、圆形、图片等),支持拖拽。

3.2 创建基础拖拽界面

我们先从简单的拖拽矩形开始。

代码示例:拖拽矩形

python">import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene, QGraphicsRectItem
from PyQt6.QtCore import Qtclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("拖拽矩形示例")self.setGeometry(100, 100, 800, 600)# 创建场景和视图self.scene = QGraphicsScene()  # 画布self.view = QGraphicsView(self.scene, self)  # 显示画布self.setCentralWidget(self.view)# 添加矩形图形项rect = QGraphicsRectItem(0, 0, 100, 100)  # 创建一个矩形rect.setBrush(Qt.GlobalColor.blue)  # 设置填充颜色rect.setFlag(QGraphicsRectItem.GraphicsItemFlag.ItemIsMovable)  # 设置可拖动self.scene.addItem(rect)  # 添加到画布中# 创建应用程序
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

运行结果:

  • 窗口中会显示一个矩形,用户可以用鼠标拖动它。
    在这里插入图片描述

3.3 添加多个拖拽元素

现在,我们在画布上添加多个拖拽组件(矩形、圆形等),并为它们设置不同的颜色和大小。

代码示例:多个拖拽元素

python">import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene, QGraphicsRectItem, QGraphicsEllipseItem
from PyQt6.QtCore import Qtclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("多个拖拽元素")self.setGeometry(100, 100, 800, 600)# 创建场景和视图self.scene = QGraphicsScene()self.view = QGraphicsView(self.scene, self)self.setCentralWidget(self.view)# 添加矩形rect = QGraphicsRectItem(0, 0, 100, 100)rect.setBrush(Qt.GlobalColor.blue)rect.setFlag(QGraphicsRectItem.GraphicsItemFlag.ItemIsMovable)self.scene.addItem(rect)# 添加圆形circle = QGraphicsEllipseItem(150, 150, 100, 100)  # 圆形circle.setBrush(Qt.GlobalColor.green)circle.setFlag(QGraphicsEllipseItem.GraphicsItemFlag.ItemIsMovable)self.scene.addItem(circle)# 添加另一个矩形rect2 = QGraphicsRectItem(300, 100, 150, 50)rect2.setBrush(Qt.GlobalColor.red)rect2.setFlag(QGraphicsRectItem.GraphicsItemFlag.ItemIsMovable)self.scene.addItem(rect2)# 创建应用程序
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

运行结果:

  • 画布上会显示三个图形:一个蓝色矩形、一个绿色圆形、一个红色矩形。
  • 用户可以用鼠标拖动这些元素到任意位置。
    在这里插入图片描述

3.4 添加工具箱

我们现在为界面添加一个简单的工具箱,允许用户从工具箱中拖拽组件到画布。

代码示例:工具箱 + 拖拽

python">import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow, QGraphicsView, QGraphicsScene, QGraphicsRectItem,QDockWidget, QListWidget, QListWidgetItem
)
from PyQt6.QtCore import Qtclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("工具箱 + 拖拽")self.setGeometry(100, 100, 800, 600)# 创建场景和视图self.scene = QGraphicsScene()self.view = QGraphicsView(self.scene, self)self.setCentralWidget(self.view)# 创建工具箱self.toolbox = QDockWidget("工具箱", self)self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.toolbox)# 工具箱内容:列表self.list_widget = QListWidget()self.toolbox.setWidget(self.list_widget)# 添加工具箱选项for shape in ["矩形", "圆形"]:item = QListWidgetItem(shape)self.list_widget.addItem(item)# 连接工具箱事件self.list_widget.itemClicked.connect(self.add_item_to_scene)def add_item_to_scene(self, item):"""根据工具箱选项在画布上添加图形"""if item.text() == "矩形":rect = QGraphicsRectItem(0, 0, 100, 100)rect.setBrush(Qt.GlobalColor.blue)rect.setFlag(QGraphicsRectItem.GraphicsItemFlag.ItemIsMovable)self.scene.addItem(rect)elif item.text() == "圆形":circle = QGraphicsEllipseItem(0, 0, 100, 100)circle.setBrush(Qt.GlobalColor.green)circle.setFlag(QGraphicsEllipseItem.GraphicsItemFlag.ItemIsMovable)self.scene.addItem(circle)# 创建应用程序
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

运行结果:

  • 左侧是一个工具箱,包含 “矩形” 和 “圆形” 选项。
  • 点击工具箱中的选项,图形会出现在画布上,并且可以拖拽到任意位置。
    在这里插入图片描述

3.5 画布缩放和平移

为了让用户能够更方便地操作画布,我们添加画布的缩放和平移功能。

代码示例:缩放和平移画布

python">import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene, QGraphicsRectItem
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QWheelEventclass CustomGraphicsView(QGraphicsView):def __init__(self, scene):super().__init__(scene)def wheelEvent(self, event: QWheelEvent):"""鼠标滚轮缩放画布"""zoom_factor = 1.15if event.angleDelta().y() > 0:self.scale(zoom_factor, zoom_factor)  # 放大else:self.scale(1 / zoom_factor, 1 / zoom_factor)  # 缩小class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("画布缩放和平移")self.setGeometry(100, 100, 800, 600)# 创建场景和自定义视图self.scene = QGraphicsScene()self.view = CustomGraphicsView(self.scene)self.setCentralWidget(self.view)# 添加一个矩形rect = QGraphicsRectItem(0, 0, 100, 100)rect.setBrush(Qt.GlobalColor.blue)rect.setFlag(QGraphicsRectItem.GraphicsItemFlag.ItemIsMovable)self.scene.addItem(rect)# 创建应用程序
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

运行结果:

  • 用户可以用鼠标滚轮缩放画布。
  • 元素依然可以拖拽,画布整体可缩放。
    在这里插入图片描述

下一步计划

现在已经完成了:

  1. 拖拽组件到画布。
  2. 工具箱功能。
  3. 画布缩放和平移。

接下来,将学习如何 实现连线功能,用于连接画布上的不同组件(类似 Visio 的箭头连接功能)。


http://www.ppmy.cn/server/153055.html

相关文章

GESP CCF C++八级编程等级考试认证真题 2024年12月

202412 GESP CCF C八级编程等级考试认证真题 1 单选题(每题 2 分,共 30 分) 第 1 题 小杨家响应国家“以旧换新”政策,将自家的汽油车置换为新能源汽车,正在准备自编车牌。自编车牌包括5 位数字或英文字母&#xff0c…

力扣题目解析--两数相除

题目 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.…

微调大模型时,如何进行数据预处理? 将<input, output>转换为模型所需的<input_ids, labels, attention_mask>

原始训练数据集格式如下&#xff1a; <input, output> 形式&#xff1a;字符 模型训练所需数据格式如下&#xff1a; # tokenizer处理后 return {"input_ids": example,"labels": labels,"attention_mask": example_mask, } 将字符转…

鸿蒙项目云捐助第十七讲云捐助我的页面上半部分的实现

鸿蒙项目云捐助第十七讲云捐助我的页面上半部分的实现 在一般的应用app中都会有一个“我的”页面&#xff0c;在“我的”页面中可以完成某些设置&#xff0c;也可以完成某些附加功能&#xff0c;如“修改密码”等相关功能。这里的鸿蒙云捐助也有一个“我的”功能页面。这里对“…

第二节:让电机转起来【51单片机-L298N-步进电机教程】

摘要&#xff1a;本节介绍用简单的方式&#xff0c;让步进电机转起来。其目的之一是对电机转动有直观的感受&#xff0c;二是熟悉整个开发流程 本系列教程必要的51单片机基础包括IO口操作、中断、定时器三个部分&#xff0c;可先行学习 一、软件清单 需要用到的软件有keil5编译…

opencv sdk for java中提示无stiching模块接口的问题

1、问题介绍 安卓项目中有新的需求&#xff0c;在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时&#xff0c;出现大量报错&#xff0c;如下截图所示 实际上&#xff0c;其他opencv的接口函数 例如 core dnn等都能正常使用&#xff0c;直觉上初步怀疑 ope…

原点安全再次入选信通院 2024 大数据“星河”案例

近日&#xff0c;中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织开展的 2024 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

SQL Server 数据库更新调用外部HTTP请求

sql server developer 当插入数据和update数据的时候能否调用http请求 https://learn.microsoft.com/zh-cn/sql/relational-databases/clr-integration/database-objects/getting-started-with-clr-integration?viewsql-server-ver15&tabscs 步骤 2: 创建 CLR 程序集 set …