如何在PyQt5/PySide2中获取窗口中的光标位置



问题和简报

你好。我正在尝试修复PyQt5窗口的一个问题,该窗口有一个自定义的标题栏。如果您最大化窗口,并将光标悬停在标题栏上并拖动窗口以移动它,则窗口将调整大小,您将能够正常移动它。

但是,当窗口在使用光标点击和拖动方法最大化之前恢复以前的状态时,光标不会抓住标题栏上的位置来移动窗口,而是停留在启动点击和拖动方式的同一位置,因此光标位于屏幕的另一侧,神秘地移动窗口。

  • 我该如何使光标抓住标题栏,当使用点击和拖动方法恢复窗口时,它将被锁定在同一位置,与普通应用程序相同

子问题

  • 如何获取窗口中光标的位置?我已经使用QCursor.pos()成功地获得了光标位置,但这会返回实际屏幕上的全局位置,但我认为我需要它在窗口上,这样我就可以尝试使它保持在标题栏上

我试过

  • 在点击和拖动恢复方法完成之前使用QCursor.pos(),然后我使用QCursor.setPos()来设置之前捕获的位置,它确实有效,但随后会导致窗口随之移动,并且光标也偏离了窗口内的预期夹点位置

代码

class MainWindow(QMainWindow): # Main Window
def __init__(self): # Main initialisation
super(MainWindow, self).__init__() # Call superclass
# UI Setup
self.ui = Ui_MainWindow()
self.ui.setupUi(self) 
# Move Window
def move_window(event):
# Restore Window (before movement)
if UIFunctions.return_status(self) == 1: # If maximized
UIFunctions.maximize_restore(self)
# QCursor.setPos(self.previous_cursor_pos)
if event.buttons() == Qt.LeftButton: # If Left Click (move window)
self.move(self.pos() + event.globalPos() - self.dragPos)
self.dragPos = event.globalPos()
event.accept()
# Set Title Bar
self.ui.title_bar.mouseMoveEvent = move_window
# Set UI Definitions
UIFunctions.ui_definitions(self)
self.show() # Show main window
def mousePressEvent(self, event): # Mouse Press Event
self.dragPos = event.globalPos()

(使用移动窗口方法的主类(

其他信息

Python版本:Python 3.8.6
使用的模块:PySide2

很乐意提供更多信息。

musicmante在评论中的解决方案解决了我的问题。我试图使用类似self.pos.x()的东西,在我将其切换到self.mapFromGlobal(QCursor.pos()).x()之后

最新更新