无框 pyqt/qml 窗口

Posted

技术标签:

【中文标题】无框 pyqt/qml 窗口【英文标题】:Frameless pyqt/qml window 【发布时间】:2014-04-05 14:10:21 【问题描述】:

我已经使用 qt/qml 完成了无框窗口,但现在我无法使用 win7 窗口链接器(左右两个角)并通过将其拖动到屏幕顶部来最大化窗口。有没有办法处理这些信号?

main.py

class MainDialog(QtQuick.QQuickView):
def __init__(self, parent = None):
    super(MainDialog, self).__init__(parent)

    self.maxed = False

    self.ctx = self.engine().rootContext()
    self.ctx.setContextProperty("view", self)
    self.ctx.setContextProperty("maximized", self.maxed)

    self.setSource(QtCore.QUrl("Main.qml"))
    self.setResizeMode(QtQuick.QQuickView.SizeRootObjectToView)

    self.setFlags(QtCore.Qt.FramelessWindowHint
        | QtCore.Qt.Window
        | QtCore.Qt.WindowSystemMenuHint

    )
    self.setColor(QtGui.QColor(QtCore.Qt.transparent))

    self.engine().quit.connect(App.quit)

main.qml

import QtQuick 2.1

Rectangle 
id: main

width: 500
height: 600

visible: true
border.color: "black"

opacity: .95
    MouseArea 
        anchors.fill: frame

        onPressed: 
            frame.mouse_x = mouseX
            frame.mouse_y = mouseY
        

        onPositionChanged: 
            view.x += mouse.x - frame.mouse_x
            view.y += mouse.y - frame.mouse_y
        

        onDoubleClicked: !maximized ? view.set_max() 
            : view.set_normal()
    

【问题讨论】:

【参考方案1】:

如果您的主窗口没有装饰,则用户无法拖动任何内容,因此无法移动或调整窗口大小。

对于移动窗口,您可以提供一个小部件来移动窗口,最简单的情况是处理该小部件上的鼠标单击事件,将窗口转换为“移动”,在这种情况下,窗口的鼠标移动处理程序根据鼠标的位置移动窗口.释放时,转换回“不动”。或者,您可以将鼠标单击应用程序的背景解释为“窗口拖动”,然后您将派生并处理鼠标事件以移动窗口。

要调整大小,您必须在窗口中创建一些用户可以拖动以调整大小的项目(除非您想使用滚轮但不遵循标准界面设计)。当单击该项目并将它们解释为“窗口调整大小”时,您将再次处理鼠标事件。

【讨论】:

以上是关于无框 pyqt/qml 窗口的主要内容,如果未能解决你的问题,请参考以下文章

qml无框窗口的阴影

无框窗口出现边框

为啥在调试过程中有时窗口标题为黑色和按钮无框

如何在 Qt 无框窗口中显示 GStreamer 视频?

pyqt5 无法将边框应用于无框窗口

在 qml 中拖动无框窗口“抖动”