QML中的非系统窗口

时间:2016-12-17 17:29:27

标签: qt qml qtquick2 qt-quick

QtQuick.Window允许我们使用带有Qt::WindowFlags的“flags”属性来定义窗口行为。从Qt docs

  

窗口标志是一种类型(例如Qt :: Dialog)和窗口系统的零或多个提示的组合(例如Qt :: FramelessWindowHint)。

     

如果窗口小部件有类型Qt :: Widget或Qt :: SubWindow并且变成窗口(Qt :: Window,Qt :: Dialog等),它将被放置在桌面上的位置(0,0)。如果窗口小部件是一个窗口并且变为Qt :: Widget或Qt :: SubWindow,则它将被放置在相对于其父窗口小部件的位置(0,0)。

Examples存在Qt使用Qt :: WindowFlags。

不幸的是,所有可用的示例都会创建 系统窗口 ,因为系统窗口管理器可以看到这些窗口。 docs声称 非系统窗口 也可以使用Qt::SubWindow标志来实现,但我无法实现此目的。 有人在QML中有一个有效的例子吗?

有关使用C语言的示例,请参阅QMdiSubWindow

2 个答案:

答案 0 :(得分:0)

import QtQuick 2.5
import QtQuick.Window 2.2

ApplicationWindow {
  id: main
  visible: true
  width: 1280
  height: 1024

  Window {
    visible: true
    flags: Qt.SubWindow
  }
}

对我来说,这会创建一个永远不在应用程序窗口顶部的辅助窗口,作为任务栏和任务切换的常规窗口不可见,并且没有最小化,最大化和关闭按钮,但它仍然具有一个框架和一个名字。但是,它不局限于应用程序主窗口的区域,它可以移动到它的外部,并且它独立于主窗口移动。

如果那是你所追求的行为,那么你就完全了。如果你想把它限制在主窗口并让它与它一起移动,只需用一个简单的qml Item和必要的装饰和按钮来实现,然后就可以放入你想要的任何内容。

答案 1 :(得分:0)

QMdiSubWindow实际上不是一个Window,而是一个小部件,就像一个特殊父窗口内的窗口一样。

我假设您正在使用QtQuick作为QML的UI技术,在这种情况下,您可以通过将任何类型的Item作为根元素的子元素并使用更高的Z值来实现此目的然后是其他任何一个孩子。

常见的技术是拥有一个或多个叠加层

import QtQuick 2.0

Item {
    id: mainWindow

    // main window content that should be below the sub windows

    Item {
        id: mdiArea

        // any item in here is on top of any mainWindow contents
        // individual stacking order can easily be controlled with each item's "z" property
    }

    Item {
        id: popupArea
        // any item in here is on top of everything in mdiArea
    }
}

而不是MdiArea的Item可以考虑在C ++中创建一个也是emtpy的自定义项,但它为其子项提供位置管理,例如: “瓦片”或“堆叠”。

这样的课程甚至可以为Qt本身做出很好的贡献。