Перетаскивание окна за верхнюю область FramelessWindowHint окна

Подскажите, пожалуйста, как сделать так, чтобы окно перетаскивалась только за верхнюю область (self.label)?

В представленном коде , окно перетаскивается при зажатии кнопки мыши в любой области окна.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

#from untitled import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1100, 460)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(1074, 7, 16, 16))
        self.pushButton.setStyleSheet("border-radius: 7px;\n"
"background-color: rgb(255, 0, 4);")
        self.pushButton.setText("")
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 1101, 31))
        self.label.setStyleSheet("background-color: rgb(65, 65, 65);")
        self.label.setText("")
        self.label.setObjectName("label")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(1049, 7, 16, 16))
        self.pushButton_2.setStyleSheet("background-color: rgb(255, 183, 0);\n"
"border-radius: 7px;")
        self.pushButton_2.setText("")
        self.pushButton_2.setObjectName("pushButton_2")
        self.label.raise_()
        self.pushButton.raise_()
        self.pushButton_2.raise_()
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        self.pushButton.clicked.connect(self.myClose)

        self.pushButton_2.clicked.connect(self.myMinimize)

        self.start = QPoint(0, 0)    # +
        self.pressing = False        # +


    def myClose(self):
#        self.pushButton.clicked.connect(self.close)
        self.close()

    def myMinimize(self):
#        self.pushButton_2.clicked.connect(self.showMinimized)
        self.showMinimized()

# + vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def mousePressEvent(self, event):
        self.start = self.mapToGlobal(event.pos())
        self.pressing = True

    def mouseMoveEvent(self, event):
        if self.pressing:
            self.end = self.mapToGlobal(event.pos())
            self.movement = self.end-self.start
            self.setGeometry(self.mapToGlobal(self.movement).x(),
                                self.mapToGlobal(self.movement).y(),
                                self.width(),
                                self.height())
            self.start = self.end

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

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = ExampleApp()
    window.show()
    sys.exit(app.exec_())```

Ответы (1 шт):

Автор решения: S. Nick

Вам нужно создать виджет верхней области и определить в ней все что вам надо.

Выглядит это примерно так:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MyBar(QWidget):
    def __init__(self, parent):
        super(MyBar, self).__init__()
        self.parent = parent

        self.layout = QHBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 10, 0)
        self.title = QLabel("My Title Bar")

        btn_size = 16 

        self.btn_close = QtWidgets.QPushButton()
        self.btn_close.setStyleSheet("""
            border-radius: 7px;
            background-color: rgb(255, 0, 4);
        """)
        self.btn_close.setText("")
        self.btn_close.clicked.connect(self.btn_close_clicked)
        self.btn_close.setFixedSize(btn_size, btn_size)
        
        
        self.btn_min = QtWidgets.QPushButton()
        self.btn_min.setStyleSheet("""
            background-color: rgb(255, 183, 0);
            border-radius: 7px;
        """)
        self.btn_min.clicked.connect(self.btn_min_clicked)
        self.btn_min.setFixedSize(btn_size, btn_size)

        self.title.setFixedHeight(32)
        self.title.setAlignment(Qt.AlignCenter)
        
        self.layout.addWidget(self.title)
        self.layout.addWidget(self.btn_min)
        self.layout.addWidget(self.btn_close)

        self.title.setStyleSheet("""
            background-color: rgb(65, 65, 65);
            color: white;
        """)

        self.start = QPoint(0, 0)
        self.pressing = False

    def resizeEvent(self, QResizeEvent):
        super(MyBar, self).resizeEvent(QResizeEvent)
        self.title.setFixedWidth(self.parent.width())

    def mousePressEvent(self, event):
        self.start = self.mapToGlobal(event.pos())
        self.pressing = True

    def mouseMoveEvent(self, event):
        if self.pressing:
            self.end = self.mapToGlobal(event.pos())
            self.movement = self.end-self.start
            self.parent.setGeometry(self.mapToGlobal(self.movement).x(),
                                self.mapToGlobal(self.movement).y(),
                                self.parent.width(),
                                self.parent.height())
            self.start = self.end

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

    def btn_close_clicked(self):
        self.parent.close()

    def btn_min_clicked(self):
        self.parent.showMinimized()
        


class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        
        self.Content = QtWidgets.QFrame(self)
        self.Content.setStyleSheet("background-color: rgb(35, 235, 35);")
        self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.Content.setFrameShadow(QtWidgets.QFrame.Raised)
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.Content)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(0)        

        self.page_1 = QtWidgets.QWidget()
        self.verticalLayout = QtWidgets.QVBoxLayout(self.page_1)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.label_1 = QtWidgets.QLabel("PAGE 1", self.page_1)
        font = QtGui.QFont()
        font.setPointSize(40)
        self.label_1.setFont(font)
        self.label_1.setStyleSheet("color: #FFF; background-color: #ba135d;")
        self.label_1.setAlignment(QtCore.Qt.AlignCenter)
        self.verticalLayout.addWidget(self.label_1)
        self.horizontalLayout.addWidget(self.page_1)
 
        self.layout  = QVBoxLayout(self)
        self.layout.addWidget(MyBar(self))
        self.layout.addWidget(self.Content, 1)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(0) 

        self.setMinimumSize(1100, 460)
        self.setWindowFlags(Qt.FramelessWindowHint)
        
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка