gpt4 book ai didi

python - 如何在 PyQt5 中减少我的标题窗口的可拖动性?

转载 作者:行者123 更新时间:2023-12-05 02:58:33 25 4
gpt4 key购买 nike

我想构建一个没有标题栏的窗口,所以我这样做了。但它不再是可拖动的。你不能让我的窗口从这里移动到那里。

我知道这是因为我,删除了标题栏,但如何修复它?

这是我的代码:

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QWidget
import sys


def window():
app = QApplication(sys.argv)
win = QMainWindow()
win.setGeometry(300, 300, 300, 300)
win.setWindowTitle("Test")
win.setWindowFlags(QtCore.Qt.FramelessWindowHint)

label = QLabel(win)
label.setText("Hello world")

win.show()
sys.exit(app.exec_())


window()

任何帮助将不胜感激。请帮助我...

最佳答案

您需要重新实现小部件的 mousePressmouseMove 方法(mouseRelease 在技术上不是强制性的,但实际上是一致性所必需的,因为释放事件必须是被 Qt 正确拦截以避免任何混淆)。前者将获取当前光标相对于几何体的位置 (self.offset),而后者将通过将新位置与当前位置相加并减去偏移量来计算新的“窗口”位置。

我还建议您使用 QWidget 而不是 QMainWindow。虽然 QMainWindow 的实现与 QWidgets 的实现非常相似,但是根据您的目的对 QMainWindow 进行子类化可能有点困难,因为它的小部件比看起来更复杂。
如果您只需要一个 QMainWindow 来获取状态栏,只需在小部件布局中添加一个新的即可;如果您还需要菜单栏,请使用 setMenuBar 将其添加到小部件的布局中.

class FramelessWidget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Test")
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.label = QLabel("Hello world", self)
self.offset = None

def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.offset = event.pos()
else:
super().mousePressEvent(event)

def mouseMoveEvent(self, event):
if self.offset is not None and event.buttons() == QtCore.Qt.LeftButton:
self.move(self.pos() + event.pos() - self.offset)
else:
super().mouseMoveEvent(event)

def mouseReleaseEvent(self, event):
self.offset = None
super().mouseReleaseEvent(event)


if __name__ == "__main__":
app = QApplication(sys.argv)
win = FramelessWidget()
win.setGeometry(300, 300, 300, 300)
win.show()
sys.exit(app.exec_())

关于python - 如何在 PyQt5 中减少我的标题窗口的可拖动性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58901806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com