Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使我的无标题窗口在PyQt5中可以拖动?_Python_Python 3.x_Pyqt_Pyqt5 - Fatal编程技术网

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