我想在我的pyside2应用程序中获得鼠标位置(不是QCursor提供的桌面鼠标位置),我尝试了两种方法。贝娄是我的代码。
import sys
from PySide2 import QtGui, QtWidgets, QtCore
class Palette(QtWidgets.QGraphicsScene):
def __init__(self, parent=None):
super().__init__(parent)
def mousePressEvent(self, event):
print(event.pos()) # always return (0,0)
print(QtWidgets.QWidget.mapToGlobal(QtCore.QPoint(0, 0))) #makes parameter type error
print(QtWidgets.QWidget.mapToGlobal(QtWidgets.QWidget)) # makes parameter type error
print(QtWidgets.QWidget.mapToGlobal(QtWidgets.QWidget.pos())) # makes parameter type error
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
palette = Palette(self)
view = QtWidgets.QGraphicsView(palette, self)
view.resize(500, 500)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = MainWindow()
main_window.resize(500, 500)
main_window.show()
app.exec_()
我非常想知道如何才能获得鼠标位置...
答案 0 :(得分:4)
据我了解,如果您想在窗口小部件中单击任何位置,则希望在窗口上获得位置。
要解决此问题,逻辑如下:
第一步,如果使用mousePressEvent()
,则event.pos()
返回相对于小部件的位置。
第二步,必须使用mapToGlobal()
将相对于小部件的位置转换为全局位置。
第三步,使用窗口的mapFromGlobal()
。
def mousePressEvent(self, event):
p = event.pos() # relative to widget
gp = self.mapToGlobal(p) # relative to screen
rw = self.window().mapFromGlobal(gp) # relative to window
print("position relative to window: ", rw)
super(Widget, self).mousePressEvent(event)
更新:
QGraphicsScene
不是窗口小部件,它不是视觉元素,尽管它是视觉元素QGraphicsView
表示的一部分。为了让您理解,我将用一个类比向您解释,假设有一个摄影师记录场景,在该示例中,QGraphicsScene
是场景,QGraphicsView
是摄像机记录的内容,即,它显示了一块QGraphicsScene
,因此可能会有另一个摄影师从另一个角度记录场景,因此它将从另一个角度显示同一场景,因此场景的位置取决于相机,因此如果您当前的问题将等同于说出点P相对于相机第i个位置的位置,并且不可能从场景中获取,应该从相机中获取。
因此,总而言之,您不应使用QGraphicsScene,而应使用QGraphicsView,以下解决方案使用2种不同的方法实现相同的逻辑:
1。创建QGraphicsView的自定义类:
import sys
from PySide2 import QtGui, QtWidgets, QtCore
class GraphicsView(QtWidgets.QGraphicsView):
def mousePressEvent(self, event):
p = event.pos() # relative to widget
gp = self.mapToGlobal(p) # relative to screen
rw = self.window().mapFromGlobal(gp) # relative to window
print("position relative to window: ", rw)
super(GraphicsView, self).mousePressEvent(event)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
scene = QtWidgets.QGraphicsScene(self)
view = GraphicsView(scene, self)
self.setCentralWidget(view)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = MainWindow()
main_window.resize(500, 500)
main_window.show()
sys.exit(app.exec_())
2。使用事件过滤器:
import sys
from PySide2 import QtGui, QtWidgets, QtCore
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
scene = QtWidgets.QGraphicsScene(self)
self._view = QtWidgets.QGraphicsView(scene, self)
self.setCentralWidget(self._view)
self._view.installEventFilter(self)
def eventFilter(self, obj, event):
if obj is self._view and event.type() == QtCore.QEvent.MouseButtonPress:
p = event.pos() # relative to widget
gp = self.mapToGlobal(p) # relative to screen
rw = self.window().mapFromGlobal(gp) # relative to window
print("position relative to window: ", rw)
return super(MainWindow, self).eventFilter(obj, event)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = MainWindow()
main_window.resize(500, 500)
main_window.show()
sys.exit(app.exec_())
另一方面,mapToGlobal()
是必须由实例调用的方法,当您使用QtWidgets.QWidget.mapToGlobal()
时,没有实例,我的问题是,您拥有哪个小部件?相对于自我的位置,因此必须使用self.mapToGlobal()
,它适用于属于从QWidget
继承为QGraphicsView
的类的对象,但不适用于{{1} },因为它不继承自QGraphicsScene
,所以它不是上面各行中指示的小部件。
答案 1 :(得分:0)
如果您不想经历子类和事件,我最近发现了一种更通用的获取光标位置的方法。
# get cursor position
cursor_position = QtGui.QCursor.pos()
print cursor_position
### Returns PySide2.QtCore.QPoint(3289, 296)