Pyqt5 鼠标事件不适用于我的自定义标签栏

Posted

技术标签:

【中文标题】Pyqt5 鼠标事件不适用于我的自定义标签栏【英文标题】:Pyqt5 mouse event not working for my custom tab bar 【发布时间】:2019-10-17 17:24:58 【问题描述】:

所以我在使用 pyqt5 制作自定义标签栏时遇到了问题。我看过一些例子,但是在实施它们时,它们似乎对我不起作用。到目前为止,这是我的代码(我只是删掉了一些注释的文本,因为它不是必需的):

from PyQt5 import QtWidgets, uic,QtCore
from PyQt5.QtCore import Qt,QObject,QThread,pyqtSignal,QCoreApplication,QPoint
import PyQt5.QtCore
from PyQt5.QtWidgets import QApplication,QPushButton,QVBoxLayout,QWidget,QFormLayout,QGridLayout,QLabel,QDialog,QHBoxLayout,QDesktopWidget

class LoginWindow(QWidget):
    def __init__(self):
        self.App = QtWidgets.QApplication([])
        self.LoadedApp = uic.loadUi("LoginWindow2.ui")

        self.LoadedApp.setWindowFlags(Qt.FramelessWindowHint)

        self.pressing = False
        self.start = QPoint(0, 0)
        self.center()
        self.oldPos = self.LoadedApp.pos()
        self.LoadedApp.show()
        self.App.exec()

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        print("1")
        delta = QPoint (event.globalPos() - self.oldPos)
        #print(delta)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

    def center(self):
        qr = self.LoadedApp.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.LoadedApp.move(qr.topLeft())

LoginWindow = LoginWindow()

这里的问题是鼠标移动事件似乎没有连接到pyqt5鼠标事件。我读过它应该在类中的函数具有特定函数名称或类似名称时进行连接?这很令人困惑,我的登录窗口似乎没有让步。这个鼠标事件非常令人困惑,我尝试了其他两种方法,但我最终删除了实现,因为它对我来说毫无意义。

这是用户界面的下载链接:https://cdn.discordapp.com/attachments/516367579598684184/634439342940487680/LoginWindow2.ui

这是 UI 的样子(左侧的层次结构集中在条形 QLabel 小部件上):https://cdn.discordapp.com/attachments/516367579598684184/634439663557541918/unknown.png

我试图让顶部栏可以拖动,而不是整个窗口只是顶部栏。有什么帮助吗? 如果您需要更多信息,或者对我正在尝试做的事情有疑问,请询问我,我会回复他们。

【问题讨论】:

【参考方案1】:

... to get the top bar to be drag-able, not the whole window ... ? 抱歉,我不明白您要拖放什么。 试试看:

from PyQt5 import QtWidgets, QtCore, uic
from PyQt5.QtCore import Qt, QObject, QThread, pyqtSignal, QCoreApplication, QPoint
from PyQt5.QtWidgets import (QApplication, QPushButton, QVBoxLayout, QWidget,
                             QFormLayout, QGridLayout, QLabel, QDialog, QHBoxLayout,
                             QDesktopWidget, QMainWindow)

class LoginWindow(QMainWindow):                                 # - (QWidget):
    def __init__(self):
        super(LoginWindow, self).__init__()                     # +
#        self.App = QtWidgets.QApplication([])
#        self.LoadedApp = uic.loadUi("LoginWindow2.ui")
        uic.loadUi("LoginWindow2.ui", self)

#        self.LoadedApp.setWindowFlags(Qt.FramelessWindowHint)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)

        self.pressing = False
        self.start = QPoint(0, 0)
        self.center()
#        self.oldPos = self.LoadedApp.pos()
        self.oldPos = self.pos()              
#        self.LoadedApp.show()
#        self.App.exec()

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

    def center(self):
#        qr = self.LoadedApp.frameGeometry()
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
#        self.LoadedApp.move(qr.topLeft())
        self.move(qr.topLeft())


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = LoginWindow()
    w.show()
    sys.exit(app.exec_())


更新

我仍然想要制作它,以便在窗口顶部的QLabel区域中按住鼠标屏幕时,可以在屏幕上拖到屏幕上的窗口。 x 按钮所在的区域。我该怎么做呢?

from PyQt5 import QtWidgets, QtCore, uic
from PyQt5.QtCore import Qt, QObject, QThread, pyqtSignal, QCoreApplication, QPoint
from PyQt5.QtWidgets import (QApplication, QPushButton, QVBoxLayout, QWidget,
                             QFormLayout, QGridLayout, QLabel, QDialog, QHBoxLayout,
                             QDesktopWidget, QMainWindow)

class LoginWindow(QMainWindow):                                 
    def __init__(self):
        super(LoginWindow, self).__init__()                     
        uic.loadUi("LoginWindow2.ui", self)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.pressing = False
        self.start = QPoint(0, 0)
        self.center()
        self.oldPos = self.pos()              

    def mouseReleaseEvent(self, QMouseEvent):
        self.pressing = False

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):

        if event.pos().y() > 20:                                    # <---
            return                                                  # <---

        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = LoginWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

我试用了这段代码,成功了!非常感谢S.尼克!但是,我仍然想要制作它,以便在窗口顶部的QLabel区域中单击鼠标时,可以在屏幕上拖动屏幕上拖动窗口。 x 按钮所在的区域。我该怎么做呢? 是的!!!非常感谢!它就像我想要的那样工作!我非常感谢这个 ty 伙计! :D

以上是关于Pyqt5 鼠标事件不适用于我的自定义标签栏的主要内容,如果未能解决你的问题,请参考以下文章

Bold / Italic不适用于使用PhantomJS的自定义字体

为啥 jQuery .html() 方法不适用于 IE8 中的自定义标签?

为啥我的容器注册表适用于 gitlab 自动部署,但不适用于我的自定义管道?

标签栏自定义按钮图像不显示

PyQt5 无边框窗口重新定义鼠标事件

<ReferenceArrayInput /> 不适用于我的自定义数据提供程序(棱镜)