Перетаскивание окна за верхнюю область 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_())
