Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
Qt 有选择地公开C++;QML的核心逻辑_Qt_Qml - Fatal编程技术网

Qt 有选择地公开C++;QML的核心逻辑

Qt 有选择地公开C++;QML的核心逻辑,qt,qml,Qt,Qml,我想设置特定QML组件的上下文属性,而不是在根上下文中。我不希望在组件外部访问该属性。是否有一种方式从C++访问组件的上下文,以便只允许从组件上下文中访问命名的属性,而不是从全局命名空间访问?我希望保持QML声明,而不是在C++中创建组件来访问它的上下文。 //main.qml Item { Button { // this should NOT work text: ctxProp.text } OtherQml { } }

我想设置特定QML组件的上下文属性,而不是在根上下文中。我不希望在组件外部访问该属性。是否有一种方式从C++访问组件的上下文,以便只允许从组件上下文中访问命名的属性,而不是从全局命名空间访问?我希望保持QML声明,而不是在C++中创建组件来访问它的上下文。
//main.qml
Item {
    Button {
        // this should NOT work
        text: ctxProp.text
     }
     OtherQml {
     }
}

//OtherQml.qml
Item {
    Button {
        // this should work
        text: ctxProp.text
    }
}

//main.cpp
QGuiApplication app(art, argv);
QQmlQpplicationEngine engine;

// Some QObject Type
CtxProp ctxProp;
// I'd like to set the context such that only OtherQml.qml can access
// this context propery. Setting in root context property makes it global
engine.rootContext()->setContextProperty("ctxProp", &ctxProp);

您应该实现一个只在导入位置可见的单例。这是向QML公开核心逻辑的最佳和最有效的解决方案,因为它不涉及树查找,并且只在您选择导入它的地方可见

qmlRegisterSingletonType<CtxProp>("Sys", 1, 0, "Core", getCoreFoo);
// and in QML
import Sys 1.0
...
doStuffWith(Core.text)

谢谢dtech。我更新了我的问题,详细阐述了
ctxProp
的起源。在这种情况下,有没有办法“隐藏”<代码> CTXPROP?@ RysChayaFER上下文属性都在普通的QML示例中,但我个人认为它们不是一个好的实践。我想举个例子吧,但人们倾向于从字面上理解它,并过度使用它,而事实上,对于每一个上下文属性的使用,实际上都有更好的方法。在您的特定情况下,您为根对象上下文设置了属性,因此它将对整个对象树可见,除非有阴影。如果你不希望这样,不要把它设置为根上下文——简单和简单。如果它是一个“核心逻辑”C++对象,你需要暴露于QML,然后将它登记为一个单独的文件,并在需要的地方导入。如果它只是一些值,你就不需要触摸C++了。谢谢提示。我刚刚开始使用QML,并阅读了很多示例。如果您认为上下文属性不是好的实践,那么您通常如何处理QML应用程序的业务逻辑?我想我的最终目标是让C++对象封装业务逻辑,并限制由不同的QML组件/文件访问的业务逻辑的范围。编辑:刚刚看到你的评论上面。谢谢你的建议!单身是最好的解决方案。解析上下文属性可能需要很多时间,这取决于您在对象树中的深度,它必须深入每个组件范围,直到触及根上下文。对于单身者,你会说“这就是我想要的”,这样会更有效率。并且它仅在您选择导入它的位置可见。
// main.cpp

static Core * c;
static QObject * getCore(QQmlEngine *, QJSEngine *) { return c; }

int main(int argc, char *argv[]) {
  QGuiApplication app(argc, argv);
  QQmlApplicationEngine engine; 
  c = new Core; // create
  engine.setObjectOwnership(c, QQmlEngine::CppOwnership); // don't manage
  qmlRegisterSingletonType<Core>("Sys", 1, 0, "Core", getCore); // reg singleton
  engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); // load main qml
  return app.exec();
}