Событие мыши Pyqt5 не работает для моей пользовательской панели вкладок - PullRequest
1 голос
/ 17 октября 2019

Так что у меня возникли проблемы с созданием пользовательской панели вкладок с 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

И вот как выглядит пользовательский интерфейс (с иерархией слева, сфокусированной на виджете QLabel панели): https://cdn.discordapp.com/attachments/516367579598684184/634439663557541918/unknown.png

Я пытаюсь сделать верхнюю панель перетаскиваемой, а невсе окно только верхний барЛюбая помощь? Если вам нужна дополнительная информация или у вас есть вопросы по поводу того, что я пытаюсь сделать, пожалуйста, спросите меня, и я отвечу на них.

1 Ответ

1 голос
/ 18 октября 2019

... 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


Обновление

Я все еще хочусделайте так, чтобы окно можно было перетаскивать по экрану, удерживая нажатой кнопку мыши, находящуюся в области QLabel в самой верхней части окна, которая в результате должна выступать в качестве вкладки. Та область, где лежит кнопка х. Как бы мне это сделать?

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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...