- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了这样的东西。我创建了一个 QGraphicsPixmapItem 对象,可以将其添加到 QGraphicsView 中。我想将端口添加到我创建的这些对象中。我想在这些端口和我创建的对象之间建立连接。我不知道该怎么做。你能帮我吗?
我的代码
class Part(QGraphicsPixmapItem):
def __init__(self, name):
super().__init__()
self.name = name
self.setFlags(self.ItemIsSelectable | self.ItemIsMovable | self.ItemIsFocusable)
self.label = QLabel("Deneme")
self.pixmap = QPixmap("image/" + name + ".png")
self.setPixmap(self.pixmap)
self.inputs = {}
self.outputs = {}
def keyPressEvent(self, event):
if (event.matches(QKeySequence.Delete)):
self.delete()
def contextMenuEvent(self, event):
menu = QMenu()
delete = menu.addAction('Delete')
delete.triggered.connect(self.delete)
menu.exec_(event.screenPos())
def showInfo(self,event):
pass
def delete(self):
# Delete all connection connected to the part
for input in self.inputs:
while len(self.inputs[input].connection) > 0:
self.inputs[input].connection[0].delete()
for output in self.outputs:
while len(self.outputs[output].connection) > 0:
self.outputs[output].connection[0].delete()
# Delete the part
self.scene().removeItem(self)
最佳答案
使用 QGraphicsPixmapItem 作为建立连接的基础是一个糟糕的选择,因为很难检测终端在哪里,相反,我建议使用 QGraphicsPathItem,它作为 QGraphicsLineItem 的子项,可能是连接节点。对于实现我基于my old answer .
from PyQt5 import QtCore, QtGui, QtWidgets
class Edge(QtWidgets.QGraphicsLineItem):
def __init__(self, source, dest, parent=None):
super().__init__(parent)
self.source = source
self.dest = dest
self.source.addEdge(self)
self.dest.addEdge(self)
self.setPen(QtGui.QPen(QtCore.Qt.red, 1.75))
self.adjust()
def adjust(self):
self.prepareGeometryChange()
self.setLine(QtCore.QLineF(self.dest.end(), self.source.end()))
class TerminalItem(QtWidgets.QGraphicsLineItem):
def __init__(self, line, parent=None):
super().__init__(line, parent)
self.setAcceptHoverEvents(True)
self.setPen(QtGui.QPen(QtGui.QColor(QtCore.Qt.transparent), 4))
self.edges = []
def addEdge(self, edge):
self.edges.append(edge)
def mousePressEvent(self, event):
event.accept()
def mouseMoveEvent(self, event):
event.accept()
def end(self):
return self.mapToScene(self.line().p1())
def hoverEnterEvent(self, event):
self.setPen(QtGui.QPen(QtGui.QColor(QtCore.Qt.red), 4))
def hoverLeaveEvent(self, event):
self.setPen(QtGui.QPen(QtGui.QColor(QtCore.Qt.transparent), 4))
class PortItem(QtWidgets.QGraphicsPathItem):
def __init__(self, parent=None):
super().__init__(parent)
self.end_ports = []
self.setFlags(
QtWidgets.QGraphicsItem.ItemIsMovable
| QtWidgets.QGraphicsItem.ItemSendsGeometryChanges
)
self.create_path()
self.create_end_ports()
def create_path(self):
raise NotImplementedError
def create_end_ports(self):
raise NotImplementedError
def itemChange(self, change, value):
if change == QtWidgets.QGraphicsItem.ItemPositionHasChanged:
for ports in self.end_ports:
for edge in ports.edges:
edge.adjust()
return super().itemChange(change, value)
class ANDPortItem(PortItem):
def create_path(self):
path = QtGui.QPainterPath()
s = 20
path.moveTo(0, 1)
path.lineTo(2, 1)
path.lineTo(2, 0)
path.lineTo(6, 0)
path.arcTo(QtCore.QRectF(4, 0, 4, 4), 90, -180)
path.lineTo(2, 4)
path.lineTo(2, 1)
path.moveTo(2, 3)
path.lineTo(0, 3)
path.moveTo(8, 2)
path.lineTo(10, 2)
tr = QtGui.QTransform()
tr.scale(s, s)
path = tr.map(path)
self.setPath(path)
def create_end_ports(self):
s = 20
for p1, p2 in (
((0, 1), (0.5, 1)),
((0, 3), (0.5, 3)),
((10, 2), (9.5, 2)),
):
item = TerminalItem(
QtCore.QLineF(s * QtCore.QPointF(*p1), s * QtCore.QPointF(*p2)),
self,
)
self.end_ports.append(item)
class NANDPortItem(ANDPortItem):
def create_path(self):
path = QtGui.QPainterPath()
s = 20
path.moveTo(0, 1)
path.lineTo(2, 1)
path.lineTo(2, 0)
path.lineTo(6, 0)
path.arcTo(QtCore.QRectF(4, 0, 4, 4), 90, -180)
path.lineTo(2, 4)
path.lineTo(2, 1)
path.moveTo(2, 3)
path.lineTo(0, 3)
path.moveTo(8, 2)
path.addEllipse(QtCore.QRectF(8, 2 - 0.25, 0.5, 0.5))
path.moveTo(8.5, 2)
path.lineTo(10, 2)
tr = QtGui.QTransform()
tr.scale(s, s)
path = tr.map(path)
self.setPath(path)
class BulBItem(PortItem):
def create_path(self):
s = 20
path = QtGui.QPainterPath()
path.moveTo(0, 2)
path.lineTo(1, 2)
path.addEllipse(QtCore.QRectF(1, 0, 4, 4))
tr = QtGui.QTransform()
tr.scale(s, s)
path = tr.map(path)
self.setPath(path)
def create_end_ports(self):
s = 20
item = TerminalItem(
QtCore.QLineF(
s * QtCore.QPointF(0, 2), s * QtCore.QPointF(0.75, 2)
),
self,
)
self.end_ports.append(item)
class ClockItem(PortItem):
def create_path(self):
s = 20
path = QtGui.QPainterPath()
path.moveTo(0, 2)
path.lineTo(1, 2)
path.addRect(QtCore.QRectF(1, 0, 4, 4))
tr = QtGui.QTransform()
tr.scale(s, s)
path = tr.map(path)
self.setPath(path)
def create_end_ports(self):
s = 20
item = TerminalItem(
QtCore.QLineF(
s * QtCore.QPointF(0, 2), s * QtCore.QPointF(0.75, 2)
),
self,
)
self.end_ports.append(item)
class GraphicsView(QtWidgets.QGraphicsView):
def __init__(self, scene=None, parent=None):
super().__init__(scene, parent)
self.setRenderHints(QtGui.QPainter.Antialiasing)
self.line_item = QtWidgets.QGraphicsLineItem()
self.line_item.setPen(QtGui.QPen(QtGui.QColor("black"), 4))
self.scene().addItem(self.line_item)
self.line_item.hide()
self.start_item = None
def mousePressEvent(self, event):
items = self.items(event.pos())
for item in items:
if isinstance(item, TerminalItem):
item.setPen(QtGui.QPen(QtCore.Qt.red, 4))
self.line_item.show()
sp = item.end()
line = QtCore.QLineF(sp, sp)
self.line_item.setLine(line)
self.start_item = item
break
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if self.line_item.isVisible():
l = self.line_item.line()
l.setP2(self.mapToScene(event.pos()))
self.line_item.setLine(l)
for item in self.items():
if (
isinstance(item, TerminalItem)
and item is not self.start_item
):
item.setPen(QtGui.QPen(QtCore.Qt.transparent, 4))
for item in self.items(event.pos()):
if isinstance(item, TerminalItem):
item.setPen(QtGui.QPen(QtCore.Qt.red, 4))
super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if self.line_item.isVisible():
self.line_item.hide()
for item in self.items():
if isinstance(item, TerminalItem) and item:
item.setPen(QtGui.QPen(QtCore.Qt.transparent, 4))
end_item = None
for item in self.items(event.pos()):
if isinstance(item, TerminalItem):
end_item = item
break
if end_item is not None:
edge = Edge(self.start_item, end_item)
self.scene().addItem(edge)
self.start_item = None
super().mouseReleaseEvent(event)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
scene = QtWidgets.QGraphicsScene()
graphicsview = GraphicsView(scene)
for t, p in (
(ANDPortItem, QtCore.QPointF(0, 0)),
(BulBItem, QtCore.QPointF(250, 0)),
(ClockItem, QtCore.QPointF(0, 250)),
(NANDPortItem, QtCore.QPointF(250, 250)),
):
item = t()
item.setPos(p)
scene.addItem(item)
self.setCentralWidget(graphicsview)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
关于python - 将端口添加到 QGraphicsPixmapItem 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55892706/
我目前正在 Python 中使用 PyQt4,但我无法在网上找到任何有关将 PyQt UI 上的 GraphicsView 类中的 2 个不同项目组合在一起的信息。这可能吗? 目标是将一个 QGrap
我目前正在 Python 中使用 PyQt4,但我无法在网上找到任何有关将 PyQt UI 上的 GraphicsView 类中的 2 个不同项目组合在一起的信息。这可能吗? 目标是将一个 QGrap
我不久前开始使用 PyQt4,现在我尝试使用 QGraphicsItemAnimation 创建一个小动画。我以前从未使用 PyQt4 这样做过,我总是使用 pygame。必须有不同的图层,qpixm
QGraphicsPixmapItem 和 QGraphicsItem 一样,有一个方法 update(x0, y0, width, height),以便仅在 QGraphicsScene 上部分重绘
我在缩放和转换 QGraphicsPixmapItem 时遇到问题。我创建了图形编辑器,我在其中使用初始大小为 100,100 的 QGraphicsItem,之后我通过 setTransform()
我希望我的 QGraphicsPixmapItem 在 QGraphicScene 上变得可选(即可以更一般的方式点击),但它不是。我实际上是在修改 Qt 的 Diagram Scene sample
我正在使用 QGraphicsScene/View 开发自定义小部件,但我之前没有相关经验。 自定义小部件是一个图像查看器,需要跟踪鼠标移动并向其父对话框/窗口发送信号。信号将是鼠标光标下像素的位置及
我创建了这样的东西。我创建了一个 QGraphicsPixmapItem 对象,可以将其添加到 QGraphicsView 中。我想将端口添加到我创建的这些对象中。我想在这些端口和我创建的对象之间建立
我正在尝试在 PyQt5 中为 QGraphicsPixmapItem 制作动画。程序按原样崩溃,没有任何错误消息,删除有关变量“anime”的行使程序正常工作。 这是 QGraphicsPixMap
首先,我是一个完全的初学者所以请原谅我,如果这个问题很愚蠢或被误导了。我有以下问题,我创建这样的图形 setPixmap(QPixmap(":Graphics/Terrain")); (这是一个正方形
我需要一个对象,它结合了 QGraphicsPixmapItem 和 QGraphicsTextItem(图像 + 文本)的特性。 多重继承是最好的方法还是有任何禁忌症?如果有,您有什么建议? 最佳答
我正在开发一个以 Qt 4.8 作为 GUI 框架的 C++ 应用程序:一个子类 QGraphicsView 渲染一个子类 QGraphicsScene,其中包含一个或多个子类 QGraphicsPi
我想在我的QGraphicsScene中使用QPropertyAnimation为QGraphicsPixmapItem设置动画。 QPixmap pixmap(filePath); QGraphic
我有两个QGraphicsPixmapItem,它们的边缘都是透明的,而且它们不是矩形。当我尝试使用 QGraphicsItem::collidingItems() 时,它只检查它们的边界矩形是否发生
我正在尝试创建自己的 QGraphicsPixmapItem,我可以在其中激活悬停模式,并且我想在悬停在项目的矩形上时绘制黑色边框,并在离开矩形空间时恢复正常。 我开始了这段代码,但不知道接下来要做什
我编写了一个小代码来使用 QtCreator 测试 QGraphicsView 的功能。 代码非常简单,只是创建了一个继承自 QGraphicsView 的类,上面有一个 QGraphicsScene
我继承了 QGraphicsView(类 Display)并实现了从 QTableView 拖放。 QGraphicsScene 中有预先存在的项目,并且 scene()->itemsBounding
我正在尝试实现一个基本游戏... 我按下键盘按钮,但我添加到我的 QGraphicsScene 的 QGraphicsPixmapItem不动,我实现了一个keyPressedEvent函数... 我
我正在使用 QGraphicsScene,我想要一些在移动时发出信号的项目。 不幸的是,QGraphicsPixmapItem 没有任何信号,所以我将它子类化: class InteractiveGr
我在 QGraphicsScene 中有一个 QGraphicsPixmapItem,然后我在 QGraphicsView 中放大并旋转它。如果没有旋转或者我没有放大太多,一切都很好,但是当我放大(像
我是一名优秀的程序员,十分优秀!