【问题标题】:Non-system windows in QMLQML 中的非系统窗口
【发布时间】:2016-12-17 17:29:27
【问题描述】:

QtQuick.Window 允许我们使用带有Qt::WindowFlags 的“标志”属性来确定窗口行为的范围。来自Qtdocs

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

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

Examples 存在 QML 使用 Qt::WindowFlags。

不幸的是,所有可用的示例都创建了系统窗口,因为这些窗口对系统窗口管理器都是可见的。 docs 声称 非系统窗口 也可以使用 Qt::SubWindow 标志实现,但我无法实现这一点。 有人有 QML 的工作示例吗?

请参阅QMdiSubWindow 了解它在 C 中工作的示例。

【问题讨论】:

  • 所以你基本上想要一个系统窗口内的伪窗口?
  • 是的。我可以在 QML 中从头开始实现它吗?也是的。但是,如果它已经得到支持,为什么还要花时间呢?作为补充说明,我还希望有人告诉我 Qt::SubWindow 实际上可以在 QML 中工作。
  • 可以参考this问题。最简单的方法可能是实现一个“假”内窗口。
  • 另外this 几乎可以回答您的问题。没有支持。这有点老了,但 AFAIK 从这个角度来看没有任何进展。
  • @BaCaRoZzo 谢谢!我已经看到了这两个,但仍然希望从框架中获得一些帮助,包括一些基本逻辑,如最小化、最大化、拖动等。 问:QMdiArea 选项是否支持多层嵌套窗口?我的猜测是没有。

标签: qt qml qtquick2 qt-quick


【解决方案1】:
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 并带有必要的装饰和按钮,然后你可以在里面放任何你想要的内容。

【讨论】:

  • 能否包含 QtQuick 版本?谢谢!
  • 这对我来说在 Ubuntu 16.04 上失败了。子窗口对窗口管理器仍然可见。
  • 显然平台之间存在差异,在 Windows 上它按描述工作。
【解决方案2】:

QMdiSubWindow 实际上并不是一个窗口,而是一个小部件,其行为类似于特殊父窗口中的窗口。

我暂时假设您正在使用 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
    }
}

代替Item 用于 MdiArea 可以考虑在 C++ 中创建一个同样为空的自定义项,但它为其子项提供位置管理,例如“平铺”或“堆栈”。

这样的类甚至可以对 Qt 本身做出很好的贡献。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2015-12-15
    • 2010-12-08
    • 2011-08-03
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多