首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从另一个QML文件中打开新的QML文件

从另一个QML文件中打开新的QML文件
EN

Stack Overflow用户
提问于 2020-11-23 23:40:53
回答 3查看 705关注 0票数 1

当用户单击test1.qml中的按钮时,我正在尝试打开test2.qml文件。

我可以使用qml StackLayout,也可以通过Static Loading文件和使用qml Loader来做到这一点。

代码语言:javascript
运行
复制
// main.qml
Window {
  width: 400
  height: 400

  StackLayout {
    id: myStack
    anchors.fill: parent
   
    Test1 {}
    Test2 {} 
  }
}

// Test1.qml 
Item {
  width: 400 
  height: 400

  Button {
    text: "Move Test2"
    onClicked: {
       myStack.currentIndex = 1 // Move to page 2
    }
  }
}

// Test2.qml 
Item {
  width: 400 
  height: 400

  Button {
    text: "Move Test1"
    onClicked: {
       myStack.currentIndex = 0 // Move to page 1
    }
  }
}

但是有没有一种方法可以从另一个QML文件中打开.qml文件,而不需要使用StackLayout或Loader,甚至不需要静态地包含文件和设置可见性?

有没有办法可以使用QT Quick C++ API或者直接从QML加载文件?

EN

回答 3

Stack Overflow用户

发布于 2020-12-03 23:44:22

我想你可能在找这个:https://doc.qt.io/qt-5/qtqml-modules-qmldir.html

让我们来看看他们的示例代码:

代码语言:javascript
运行
复制
//Style.qml with custom singleton type definition
pragma Singleton
import QtQuick 2.0

QtObject {
    property int textSize: 20
    property color textColor: "green"
}

上面是我们想要导入到其他qml文件中的自定义类型。

代码语言:javascript
运行
复制
// qmldir declaring the singleton type
module CustomStyles
singleton Style 1.0 Style.qml

上面是我们放入qmldir文件中的内容。您必须创建一个单独的模块,然后该模块将具有此qmldir文件。您必须使用QtCreator向导创建一个空文件,并将其命名为qmldir。这是Qt模块的一个特性。在qmldir文件中,您可以说“这是我的模块的名称,它在Style.qml中定义了这个类型”。这就是它所做的一切。您可以在其中定义任意数量的qml类型。

代码语言:javascript
运行
复制
// singleton type in use
import QtQuick 2.0
import CustomStyles 1.0

Text {
    font.pixelSize: Style.textSize
    color: Style.textColor
    text: "Hello World"
}

在这里,我们从CustomStyles模块导入样式,并在需要的地方使用它。

所以这里发生的事情是

  1. 创建了一个模块。一个模块就是一个文件夹,里面基本上有一个.pro文件和一个qmldir文件。您将使用import语句导入模块。您可能希望使用TEMPLATE = subdirs创建包含多个模块的项目。

创建

  1. Style.qml (例如),然后从该模块导出(设置为公共)。使用模块中的qmldir文件将其设置为public。

  1. 在要将qml文件导入到的qml中执行import CustomStyles 1.0或在项目中使用的任意模块名称

  1. 然后,您可以引用在qmldir文件中定义的任何QML类型,因为它已设置为public并且您导入了模块。

因此,不要像c++那样考虑它,在python中#包含一个文件,而是更像在python中导入一个模块,然后可以在该模块中引用任何公共类或函数。

如果您需要更多关于如何创建模块的说明,请随时留言。您需要创建一个模块,因为import语句导入的是模块,而不是单个文件。导入模块可以访问qmldir文件中从该模块导出的所有文件。

票数 0
EN

Stack Overflow用户

发布于 2021-01-30 01:24:33

票数 0
EN

Stack Overflow用户

发布于 2021-03-01 02:27:05

首先,我认为不可能以不同的方式加载QML文件,而不是使用Loader或静态导入。

我能想到的唯一另一种方式是直接使用QML Fiel作为一个简单的组件,当它在项目中处于相同的前缀时。

所以为了解释:如果你有一个简单的项目,所有的QML文件都在同一个前缀中。

当你有了这个结构中的所有文件后,你可以直接在这里动态地使用其他的QMl文件。据我所知,这是唯一有效地做到这一点的方法。

下面是代码: main.qml

代码语言:javascript
运行
复制
import QtQuick 2.15
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.3

Window {
  width: 400
  height: 400

  StackLayout {
    id: myStack
    anchors.fill: parent

    Test1 {}
    Test2 {}
  }
}

Test1.qml

代码语言:javascript
运行
复制
import QtQuick 2.15
import QtQuick.Controls 2.12

Item {
  width: 400
  height: 400

  Button {
    text: "Move Test2"
    onClicked: {
       myStack.currentIndex = 1 // Move to page 2
    }
  }
}

Test2.qml

代码语言:javascript
运行
复制
import QtQuick 2.15
import QtQuick.Controls 2.5

Item {
  width: 400 
  height: 400

  Button {
    text: "Move Test1"
    onClicked: {
       myStack.currentIndex = 0 // Move to page 1
    }
  }
}

当我有了你在上图中看到的结构时,这个代码对我来说是有效的。我希望这能对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64971542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档