【问题标题】:How to make my title less Window drag-able in PyQt5?如何在 PyQt5 中使我的标题更少的窗口可拖动?
【发布时间】:2023-04-06 20:56:01
【问题描述】:

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

我知道是因为我,去掉了标题栏,但是怎么解决呢?

这是我的代码:

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()

任何帮助将不胜感激。请帮我解决这个问题...

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    您需要重新实现小部件的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_())
    

    【讨论】:

    • 我可以用自己的图片自定义关闭最小化和标题栏按钮吗?因为我想让它的标题栏看起来像 macos。
    • @Andrewwhiteman 抱歉,但我有点困惑。您想要一个没有标题栏的窗口,为什么要询问应该成为其中一部分的按钮?
    • @musicamante 他们可能想要自定义标题栏,如this questionthis question。但是,那里的答案没有实现窗口大小调整,这是这种方法的另一个问题。
    • 是的@ekhumoro,你做对了!!我想要一个自定义的标题栏,它看起来像 macOS 上的标题栏。怎么做??
    • @Andrewwhiteman 我个人没有什么要补充的,我链接的问题中还没有。我建议您在那里研究答案并尝试尽可能多地实施。当您遇到无法解决的问题时,请提出新问题。
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多