Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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
C++ 如何将可分离区域(QDockWidget)添加到QML应用程序_C++_Qt_Qml_Qt5_Qt Quick - Fatal编程技术网

C++ 如何将可分离区域(QDockWidget)添加到QML应用程序

C++ 如何将可分离区域(QDockWidget)添加到QML应用程序,c++,qt,qml,qt5,qt-quick,C++,Qt,Qml,Qt5,Qt Quick,如何将可分离区域添加到QML应用程序窗口 以下面的应用程序(平铺)为例。它有多个可分离的区域。在第一个图像中,所有区域都已附着,而在第二个图像中,一个区域正在分离/重新附着: 从C++中,可以通过(参见)实现。但是有没有使用QML的解决方案?作为一种可能的解决方案,您可以创建自定义的QDialog,在其中使用适当QML文件中所需的QML内容。与主qml窗口和对话框的通信将通过自定义对话框中的Q_属性和Q_可调用定义完成 例如,指向QDialog实例的指针可以在的帮助下作为上下文属性传播到QML

如何将可分离区域添加到QML应用程序窗口

以下面的应用程序(平铺)为例。它有多个可分离的区域。在第一个图像中,所有区域都已附着,而在第二个图像中,一个区域正在分离/重新附着:


从C++中,可以通过(参见)实现。但是有没有使用QML的解决方案?

作为一种可能的解决方案,您可以创建自定义的
QDialog
,在其中使用适当QML文件中所需的QML内容。与主qml窗口和对话框的通信将通过自定义对话框中的
Q_属性
Q_可调用
定义完成


例如,指向
QDialog
实例的指针可以在的帮助下作为上下文属性传播到QML

这只是一个如何实现这种行为的想法。看一看QML类,并根据请求实际创建一个窗口

一些(未经测试的)伪代码,只是想给出一个想法“DockWindow.qml”:


注意:这段代码不会开箱即用,可能会导致“parent”属性上的依赖循环

我做了一个简单的工作示例。你可以找到它。一定有足够的评论供你整理

我使用动态创建对象,如下所示:

  • 动态创建组件(DetachableItem.qml)并将其分配给属性(不需要,但更容易找到)
  • 为这个组件的
    附加的
    属性创建连接,当它改变时我可以调用一些函数
  • 将项目移动到另一个窗口中,将对象推入其
    数据
    属性
  • 以相同的方式将其向后移动-将其推到主窗口的
    数据
    属性并隐藏单独的窗口
请随意提问或提出一些改进。我对如何改进它的任何建议都感兴趣


UPD:我更新了新的提交,在那里我摆脱了动态对象的创建。如果您仍然对动态对象创建感兴趣,您可以在投票结束时签出到

:请解释为什么它太宽。我很确定这个功能有一个预定义的类,或者有一个创建可分离区域的特定方法。我还没有在QML中直接看到这个功能。创建浮动区域很容易,但我怀疑您想要一个可拆卸的窗口。如果设备是一部手机,那么它就没有多大用处,所以它的优先级可能很低list@Appleshell我目前面临着同样的问题。我查看了Qt文档,但没有找到任何内容,因此我认为它尚未实现。你在纯QML中找到解决方案了吗?@SteveTJS向下滚动到我的答案。我做了一个小例子看看我的相关工作我试过你更新的例子。我很感谢你把它公开给每个人。它就像一个符咒。
import QtQuick 2.0
import QtQuick.Window 2.2

Rectangle {
 id: dockWidget

 property Window window: null
 property Item embedIn: null
 parent: window ? window : embedIn
 readonly property bool detached: window

 function detach() {
  if (!window) {
   window = Qt.createQmlObject('
    import QtQuick.Window 2.2
    Window { flags: …; }
    ', dockWidget, "dockWidget");
  }
 }

 function close() {
  if (window) {
   window.close();
  }
 }
}