Pyqt5鼠标事件不适用于我的自定义选项卡b

2024-06-30 15:27:19 发布

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

所以我在用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()

这里的问题是mouse move事件似乎没有连接到pyqt5 mouse事件。我读过,当类中的函数有一个特定的函数名或类似的东西时,它应该连接?这是相当混乱,我的登录窗口似乎没有动摇。这个鼠标事件非常混乱,我像其他两个方法一样尝试,但是我最终删除了实现,因为它对我来说毫无意义

这里是UI的下载链接:https://cdn.discordapp.com/attachments/516367579598684184/634439342940487680/LoginWindow2.ui

下面是UI的样子(左边的层次结构集中在barqlabel小部件上):https://cdn.discordapp.com/attachments/516367579598684184/634439663557541918/unknown.png

我想让顶栏可以拖动,而不是整个窗口,只是顶栏而已。有什么帮助吗? 如果您需要更多的信息,或有什么问题,我正在试图做请问我,我会回答他们


Tags: fromimportselfeventdefpyqt5deltacenter
1条回答
网友
1楼 · 发布于 2024-06-30 15:27:19

... 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_())

enter image description here


更新

I still want to make it so the window can be dragged across the screen when you hold click with the mouse being in the QLabel area at the very top of the window which should act as a tab as a result. That area where the x button lies. How would I go around doing that?

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_())

相关问题 更多 >