【发布时间】:2021-03-12 18:36:22
【问题描述】:
我正在尝试使用 setWindowFlags(FramelessWindowHint) 构建一个带有自定义标题栏的 GUI。
我已经成功地创建了具有各自功能的关闭/最小化按钮等,并且它们运行良好(它们不包含在我下面的代码中)。但是,使用自定义标题栏使窗口可移动,我并没有取得同样的成功。
当我运行代码并尝试拖动窗口时,光标变为蓝色加载漩涡然后崩溃。我还尝试使用调试器运行它,当我尝试拖动窗口时出现错误:
TypeError:+ 不支持的操作数类型:“QPoint”和“builtin_function_or_method”
下面是我的代码的一部分。 (当我从一个更大的项目中剪下来时,它可能有点乱。)
任何帮助解决我的问题将不胜感激,谢谢。
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtCore import Qt
WINDOW_SIZE = 0
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1200, 700)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.top_bar = QtWidgets.QWidget(self.centralwidget)
self.top_bar.setMaximumSize(QtCore.QSize(16777215, 60))
self.top_bar.setStyleSheet("background-color: rgb(52, 56, 60)")
self.top_bar.setObjectName("top_bar")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.top_bar)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.frame = QtWidgets.QFrame(self.top_bar)
self.frame.setMinimumSize(QtCore.QSize(80, 60))
self.frame.setMaximumSize(QtCore.QSize(80, 60))
self.frame.setStyleSheet("background-color:rgb(30, 34, 38);\n"
"border: 0px")
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.frame)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setSpacing(0)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.horizontalLayout_2.addWidget(self.frame)
self.header_bar = QtWidgets.QFrame(self.top_bar)
self.header_bar.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.header_bar.setFrameShadow(QtWidgets.QFrame.Raised)
self.header_bar.setObjectName("header_bar")
self.horizontalLayout_2.addWidget(self.header_bar)
self.verticalLayout.addWidget(self.top_bar)
self.content = QtWidgets.QWidget(self.centralwidget)
self.content.setStyleSheet("")
self.content.setObjectName("content")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.content)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout.addWidget(self.content)
MainWindow.setCentralWidget(self.centralwidget)
self.header_bar.mouseMoveEvent = self.moveWindow
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
def mousePressEvent(self, event):
MainWindow.dragPos = event.globalPos()
def moveWindow(self, event):
if MainWindow.isMaximized():
MainWindow.showNormal()
else:
if event.buttons() == Qt.LeftButton:
MainWindow.move((MainWindow.pos() + event.globalPos() - MainWindow.dragPos))
MainWindow.dragPos = event.globalPos()
event.accept()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
【问题讨论】:
-
在
self.header_bar.mouseMoveEvent = self.moveWindow之后添加MainWindow.dragPos = QPoint() -
@eyllanesc 这有点用,但它不能向上或向左移动,我只能向下或向右拖动?
标签: python qt pyqt pyqt5 window