【发布时间】:2021-12-30 08:29:44
【问题描述】:
我正在编写一个程序,它应该在发生双击时(在场景区域内)创建一个 QGraphicsItem,并且该项目必须在双击位置创建。我已经写了一些代码,但它不能正常工作。当我双击场景时,会创建一个项目,但在一个完全不同的位置。所以现在这就是问题所在。我需要在鼠标位置创建它。
这是我的代码:
ui_path = "C:/Users/User/Desktop/programming/Creator/Creator.ui"
class Creator(QtWidgets.QWidget):
count = 0
def __init__(self):
super(Creator, self).__init__()
loader = QtUiTools.QUiLoader()
self.ui = loader.load(ui_path, self)
self.variables()
self.ui.canvas_area.viewport().installEventFilter(self) #canvas_area is the QGraphicsView
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint)
def variables(self):
self.scene = QtWidgets.QGraphicsScene()
self.ui.canvas_area.setScene(self.scene)
def eventFilter(self, obj, event):
if obj is self.ui.canvas_area.viewport():
if event.type() == QtCore.QEvent.MouseButtonDblClick:
self.createItems(event)
return super(Creator, self).eventFilter(obj, event)
def createItems(self, event):
pos = event.pos()
self._x = pos.x()
self._y = pos.y()
rect = self.scene.addRect(self._x, self._y, 40, 40, QPen(Qt.red), QBrush(Qt.gray))
rect.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsFocusable)
rect.setFlag(QGraphicsItem.ItemIsSelectable)
if __name__ == '__main__':
creator_window = Creator()
creator_window.ui.show()
我已经阅读了一些关于 mapFromScene 和 mapToScene 的内容,并且这些可以解决问题 - 但我并不真正了解如何使用它们。还有一些这样的例子,但我发现的都是C++,我对此一无所知。因此,如果有人能帮我弄清楚如何解决这个问题,我将不胜感激。
【问题讨论】:
标签: python pyqt5 mouseevent pyside2 qgraphicsview