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

2024-06-28 10:58:24 发布

您现在位置:Python中文网/ 问答频道 /正文

问题和简报

你好。我正在尝试修复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

很高兴提供更多信息


Tags: 方法posselfeventuimovedefwindow