python编程使用PyQt创建UE蓝图
作者:在逆境中蜕变 发布时间:2023-11-20 14:24:58
标签:python,PyQt,UE,蓝图
实现思路
1、场地部署:我们需要拥有一个可以用来画节点的地方!详看我这篇文章QGraphicsScene、QGraphicsView的基础使用,这篇文章用的也是同样的方法PyQt制作预览窗口(游戏中的小地图)
2、节点创建:我们需要自定义节点,也就是下图中的方框内的东西,主要涉及到的就是Qt中的QGraphicsItem,通过继承这个类来自定义节点样式
3、连线:涉及到的就是Qt中的QGraphicsLineItem,继承这个类,并在paint中自定义连线样式,比如我这里使用的是qt自带的贝塞尔曲线
实现的效果如下,节点之间可以通过端口互相连接
1、场地部署
class EditorView(QGraphicsView):
def __init__(self, parent=None):
super(EditorView, self).__init__(parent)
self.parent = parent
self.scaleFactor = 1
self.lastPos = QPointF()
self.scene = EditorScene(self)
self.setScene(self.scene)
self.setSceneRect(-1 << 30, -1 << 30, 1 << 31, 1 << 31)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.verticalScrollBar().setEnabled(False)
self.horizontalScrollBar().setEnabled(False)
class EditorScene(QGraphicsScene):
def __init__(self, parent=None):
super(EditorScene, self).__init__(parent)
def drawBackground(self, painter, rect):
pass
# 在这里画底图,也就是上面的方格图
2、节点创建
下面是创建节点的主体,就那个黑框框的东西
class NodeItem(QGraphicsItem):
def __init__(self, parent=None):
super(NodeItem, self).__init__(parent)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)
self.setFlag(QGraphicsItem.ItemIsFocusable, True)
self.nodeName = "Node"
self.width = 150
self.height = 50
self.addPort()
def addPort(self):
leftPort = PortItem(self)
leftPort.setPos(5, self.height/2.7)
rightPort = PortItem(self)
rightPort.setPos(self.width-20, self.height/2.7)
def paint(self, painter, style, *args, **kwargs):
brush = QBrush(QColor(0xaa, 0xaa, 0xaa, 0xaa))
painter.setBrush(brush)
pen = QPen()
pen.setWidth(1)
painter.setPen(pen)
painter.drawRect(0, 0, self.width, self.height)
painter.drawText(self.width/2.5, self.height/1.8, self.nodeName)
下面是节点端口的创建
class PortItem(QGraphicsItem):
def __init__(self, parent=None):
super(PortItem, self).__init__(parent)
self.portDiam = 15
def paint(self, painter, style, *args, **kwargs):
portColor = QColor(0x00, 0xaa, 0x00, 0x66)
painter.setBrush(portColor)
pen = QPen()
pen.setColor(portColor)
pen.setWidth(2)
painter.setPen(pen)
painter.drawEllipse(0, 0, self.portDiam, self.portDiam)
在节点NodeItem里面,创建两个端口用于连接
3、连线
①首先是连线类的创建
class LineItem(QGraphicsItem):
def __init__(self, posStart, posEnd, parent=None):
super(LineItem, self).__init__(parent)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)
self.setFlag(QGraphicsItem.ItemIsFocusable, True)
self.posStart = posStart
self.posEnd = posEnd
def paint(self, painter, style, *args, **kwargs):
midPos = (self.posStart + self.posEnd)/2
lineColor = QColor(0xff, 0x00, 0x00, 0xff)
pen = QPen()
pen.setColor(lineColor)
pen.setWidth(2)
painter.setPen(pen)
linePath = QPainterPath()
linePath.moveTo(self.posStart)
linePath.cubicTo(QPointF(midPos.x(), self.posStart.y()), midPos, self.posEnd)
painter.drawPath(linePath)
②如何连接节点
def mouseReleaseEvent(self, event):
self.line = LineItem(self.portPosStart, self.portPosEnd)
self.scene.addItem(self.line)
ps写在最后,如果你的图没有刷新,你可以先把窗口缩小再打开,他就会刷新了,如果你想让他自动刷新,就调用scene.update()方法吧!
来源:https://blog.csdn.net/weixin_40301728/article/details/111569708


猜你喜欢
- Python 是一个美丽的语言,可以激发用户对它的爱。所以如果你试图加入程序员行列,或者你有点厌倦C++,Perl,Java 和其他语言,我
- 本文缘起自《一分钟了解索引技巧》的作业题。假设订单业务表结构为:order(oid, date, uid, status, money, t
- 本文实例讲述了Python实现批量修改文件名的方法。分享给大家供大家参考。具体如下:下载了评书《贺龙传奇》,文件名中却都含有xxx有声下载,
- 背景临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,相信大家在开发中经常会遇到相关的需求,下面本文将给大家详细J
- 什么是变量在Python编程语言中,变量是用于存储数据值的标识符。它们可以用来引用数据值,而不是直接使用值本身。可以使用等号(=)运算符来将
- 去年淘宝做了个“胖子”项目,就是把网页的默认宽度从780提升到了950。也就是说,基本放弃了800×600的用户(没有完全放弃,如果你仔细研
- Oracle当然是世界上最强大的数据库,但它的客户端sqlplus真的不友好,现在还不能支持上下方向键翻查历史命令,这里介绍使用readli
- 1. 吊顶下拉菜单的键盘可用性改进无障碍访问貌似最近比较火,大家都在聊,其中一块就是键盘的可访问性。我们在首页上作了些调整,让用户可以通过键
- var YX = { //得到JS内置数据类型的类型,返回值包括[Date,RegExp,Number,String,Array,Boole
- mysql取json字符串字段下的某个键的值要求:mysql版本5.7及以上SELECT JSON_EXTRACT('{"
- 经常需要读取某个文件夹下所有的图像文件。我使用python写了个简单的代码,读取某个文件夹下某个后缀的文件,将文件名生成为文本(csv格式)
- rstrip()方法返回所有字符都被去除的字符串(缺省为空格字符)结束字符串的副本。语法以下是rstrip()方法的语法:str
- 无论是Windows、Linux、还是树莓派 。配置python3的opencv环境都是让人头大的一件事情,尤其是许多人用pip安装以后,发
- 日期包常用函数time.Now(): 获取当前时间package mainimport ( "fmt&q
- 决策树是一种将数据集通过分割成小的、易于处理的子集来进行分类或回归的算法。其中每个节点代表一个用于划分数据的特征,每个叶子节点代表一个类别或
- 本文重点系统分析网页性质结构化的数据解析csv数据保存环境介绍python 3.8pycharm 专业版 >>> 激活码#
- var sss=(String.fromCharCode(127)); var xmlhttp =
- 本文介绍了三种跨域访问的方法,php,asp及jsp种访问远程文件的方法。这几天脑细胞剩下的不多了,不过问题都一个个解决了。我希望搜索引擎能
- gRPC是Google发起的一个开源RPC框架,使用HTTP/2传输协议,使用Protocol Buffers编码协议,相比RESTful框
- 前言不知道大伙有没有看到过这一句话:“中国(疫苗研发)非常困难,因为在中国我们没有办法做第三期临床试验,因为没有病人了。