Python 如何使我的无标题窗口在PyQt5中可以拖动?
我想建立一个没有标题栏的窗口,所以我这样做了。但它不再是拖拉的。你不能让我的窗户从这里移到那里 我知道这是因为我,删除标题栏,但如何修复它 这是我的代码:Python 如何使我的无标题窗口在PyQt5中可以拖动?,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我想建立一个没有标题栏的窗口,所以我这样做了。但它不再是拖拉的。你不能让我的窗户从这里移到那里 我知道这是因为我,删除标题栏,但如何修复它 这是我的代码: from PyQt5 import QtWidgets, QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QWidget import sys def window(): app = QApplication(sys.argv) w
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()
任何帮助都将不胜感激。请帮我解决这个问题……您需要重新实现小部件的
mousePress
和mouseMove
方法(mouseRelease在技术上不是强制性的,但实际上是一致性所必需的,因为Qt必须正确拦截发布事件以避免任何混淆)。前者将获得相对于几何体的当前光标位置(self.offset
),而后者将通过将新位置添加到当前位置并减去偏移量来计算新的“窗口”位置
我还建议您使用QWidget而不是QMainWindow。虽然QMainWindow实现与QWidgets非常相似,但为您的目的对QMainWindow进行子类化可能会有点困难,因为它的小部件比看起来更复杂。如果您只需要一个QMainWindow来获取状态栏,只需在小部件布局中添加一个新的状态栏;如果还需要菜单栏,请使用将其添加到小部件的布局中
您需要重新实现小部件的
mousePress
和mouseMove
方法(mouseRelease在技术上不是强制性的,但实际上是一致性所必需的,因为Qt必须正确拦截发布事件以避免任何混淆)。前者将获得相对于几何体的当前光标位置(self.offset
),而后者将通过将新位置添加到当前位置并减去偏移量来计算新的“窗口”位置
我还建议您使用QWidget而不是QMainWindow。虽然QMainWindow实现与QWidgets非常相似,但为您的目的对QMainWindow进行子类化可能会有点困难,因为它的小部件比看起来更复杂。如果您只需要一个QMainWindow来获取状态栏,只需在小部件布局中添加一个新的状态栏;如果还需要菜单栏,请使用将其添加到小部件的布局中
我可以用自己的图片自定义关闭最小化和标题栏按钮吗??“因为我想让它的标题栏看起来像macos。”安德烈·希特曼抱歉,但我有点困惑。你想要一个没有标题栏的窗口,为什么要询问应该包含在其中的按钮?@musicamante他们可能想要一个自定义标题栏,如和。不过,这里的答案并没有实现窗口大小调整,这是这种方法的另一个问题。是的@ekhumoro,你做对了!!我想有一个自定义的标题栏,它看起来像macos上的标题栏。如何做到这一点???@AndrewHiteman我个人没有什么要补充的,我链接到的问题中没有。我建议你在那里研究答案,并尽可能多地实施。当你遇到无法解决的问题时,问一个新问题。我可以用自己的图像自定义关闭最小化和标题栏按钮吗??“因为我想让它的标题栏看起来像macos。”安德烈·希特曼抱歉,但我有点困惑。你想要一个没有标题栏的窗口,为什么要询问应该包含在其中的按钮?@musicamante他们可能想要一个自定义标题栏,如和。不过,这里的答案并没有实现窗口大小调整,这是这种方法的另一个问题。是的@ekhumoro,你做对了!!我想有一个自定义的标题栏,它看起来像macos上的标题栏。如何做到这一点???@AndrewHiteman我个人没有什么要补充的,我链接到的问题中没有。我建议你在那里研究答案,并尽可能多地实施。当你遇到无法解决的问题时,问一个新问题。
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_())