使用像素坐标获取 QGraphicSscene 中的鼠标位置
get mouse position in the QGraphicScene with pixels coordinate
我尝试创建一个程序来操作图像,我想在 Qgraphicscene 中获得鼠标的位置,但是除非我在 Qgraphicview 之外启动,否则不会触发鼠标事件,
我怎样才能得到这个位置与图像的坐标(像素)
并感谢您的帮助
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.uic import *
from PIL import Image,ImageFilter,ImageQt
import sys
MainUI, _ = loadUiType('app.ui')
class MainApp(QMainWindow, MainUI):
def __init__(self):
super(MainApp, self).__init__()
QMainWindow.__init__(self)
self.setupUi(self)
def open_image(self):
img = QFileDialog.getOpenFileName(self, 'Open file',
'c:\')
pixmap = QtGui.QPixmap(img[0])
self.scene = QtWidgets.QGraphicsScene()
self.item = QtWidgets.QGraphicsPixmapItem(pixmap)
self.scene.addItem(self.item)
self.graphicsView.setScene(self.scene)
self.image =Image.open(img[0])
def mouseMoveEvent(self,e):
print(e.pos())
def main():
app = QApplication(sys.argv)
windows = MainApp()
windows.show()
app.exec_()
if __name__ == '__main__':
main()
小部件仅在启用 mouseTracking
时接收鼠标移动事件(大多数小部件默认情况下禁用)。
此外,如果您想在图形场景中跟踪鼠标事件,则必须覆盖场景的 mouseMoveEvent 或安装事件过滤器。
请注意,我删除了 __init__
中的以下行:
QMainWindow.__init__(self)
您已经在第一行调用了super().__init()__
,无需再次调用。
class MainApp(QMainWindow, MainUI):
def __init__(self):
super(MainApp, self).__init__()
self.setupUi(self)
# you could set this in QDesigner instead
self.graphicsView.setMouseTracking(True)
def open_image(self):
# ...
self.scene.installEventFilter(self)
def eventFilter(self, source, event):
if event.type() == QEvent.GraphicsSceneMouseMove:
item = self.scene.itemAt(event.scenePos(), QTransform())
if isinstance(item, QGraphicsPixmapItem):
# map the scene position to item coordinates
map = item.mapFromScene(event.scenePos())
print('mouse is on pixmap at coordinates {}, {}'.format(
map.x(), map.y()))
return super().eventFilter(source, event)
我尝试创建一个程序来操作图像,我想在 Qgraphicscene 中获得鼠标的位置,但是除非我在 Qgraphicview 之外启动,否则不会触发鼠标事件, 我怎样才能得到这个位置与图像的坐标(像素) 并感谢您的帮助
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.uic import *
from PIL import Image,ImageFilter,ImageQt
import sys
MainUI, _ = loadUiType('app.ui')
class MainApp(QMainWindow, MainUI):
def __init__(self):
super(MainApp, self).__init__()
QMainWindow.__init__(self)
self.setupUi(self)
def open_image(self):
img = QFileDialog.getOpenFileName(self, 'Open file',
'c:\')
pixmap = QtGui.QPixmap(img[0])
self.scene = QtWidgets.QGraphicsScene()
self.item = QtWidgets.QGraphicsPixmapItem(pixmap)
self.scene.addItem(self.item)
self.graphicsView.setScene(self.scene)
self.image =Image.open(img[0])
def mouseMoveEvent(self,e):
print(e.pos())
def main():
app = QApplication(sys.argv)
windows = MainApp()
windows.show()
app.exec_()
if __name__ == '__main__':
main()
小部件仅在启用 mouseTracking
时接收鼠标移动事件(大多数小部件默认情况下禁用)。
此外,如果您想在图形场景中跟踪鼠标事件,则必须覆盖场景的 mouseMoveEvent 或安装事件过滤器。
请注意,我删除了 __init__
中的以下行:
QMainWindow.__init__(self)
您已经在第一行调用了super().__init()__
,无需再次调用。
class MainApp(QMainWindow, MainUI):
def __init__(self):
super(MainApp, self).__init__()
self.setupUi(self)
# you could set this in QDesigner instead
self.graphicsView.setMouseTracking(True)
def open_image(self):
# ...
self.scene.installEventFilter(self)
def eventFilter(self, source, event):
if event.type() == QEvent.GraphicsSceneMouseMove:
item = self.scene.itemAt(event.scenePos(), QTransform())
if isinstance(item, QGraphicsPixmapItem):
# map the scene position to item coordinates
map = item.mapFromScene(event.scenePos())
print('mouse is on pixmap at coordinates {}, {}'.format(
map.x(), map.y()))
return super().eventFilter(source, event)