【问题标题】:Accessing QML's LayoutMirroring attached property from C++从 C++ 访问 QML 的 LayoutMirroring 附加属性
【发布时间】:2012-01-25 15:47:05
【问题描述】:

LayoutMirroring QML 附加属性允许将项目的方向性从左到右切换到右到左,反之亦然。我想从 C++ 代码访问项目的当前LayoutMirroring 值,扩展 QML 应用程序。我知道 qmlAttachedPropertiesObject 函数可用于从 C++ 访问附加属性,如 documentation 中所述,但我不知道在哪里可以找到在 C++ 中表示此特定属性的类。

有可能做到吗?

【问题讨论】:

  • 访问 it's current values 是什么意思?.. 那些 its 是什么意思?你能再描述一下吗!但我确信 任何 it's 值都可以分别从 C++ 代码访问或提供给 C++ 代码。使这些值对 C++ 代码可用可以通过调用JavaScript 代码中的“Q_INVOKABLE”插槽。我无法正确解释您的用例,所以我只是说说我的看法。
  • 我所说的它是 是一个特定项目的值。我已经编辑了这个问题,以便更清楚(我希望)。
  • 关于带有Q_INVOKABLE 插槽的解决方案,我认为它会起作用,但它需要我使用有问题的 C++ 对象更改 QML 代码,我希望避免这种情况。 LayoutMirroring 可以从他们的父母那里继承,所以不是只改变一个地方,我需要改变更多。

标签: c++ qt qml


【解决方案1】:

自 Qt5 起,使用 QQmlProperty 类可以轻松读取和写入附加属性。

简单的main.qml文件:

import QtQuick 2.0

Rectangle {
    LayoutMirroring.enabled: true
    LayoutMirroring.childrenInherit: true
}

简单的C++代码阅读上面LayoutMirroring.enabled附加属性:

QQuickView view;
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
view.show();

QQuickItem* rootItem = view.rootObject();
qDebug() << QQmlProperty::read(rootItem, "LayoutMirroring.enabled", qmlContext(rootItem));

控制台输出:

=> QVariant(bool, true)

【讨论】:

  • 谢谢。我不再做这个了,但这听起来应该可以。
【解决方案2】:
import QtQuick 1.1

Rectangle {
id: parentRect
property alias layoutValue : LayoutMirroring.enabled// ? true : false;// Read Only
LayoutMirroring.enabled: false
LayoutMirroring.childrenInherit: true
width: 300; height: 50
color: "yellow"
border.width: 1

Row {
    anchors { left: parent.left; margins: 5 }
    y: 5; spacing: 5

    Repeater {
        model: 5

        Rectangle {
            color: "red"
            opacity: (5 - index) / 5
            width: 40; height: 40

            Text {
                text: index + 1
                anchors.centerIn: parent
            }
        }
    }
}
}
#包括 #包括 #包括 #包括 #include “qmlapplicationviewer.h” Q_DECL_EXPORT int main(int argc, char *argv[]) { QScopedPointer app(createApplication(argc, argv)); QScopedPointer 查看器(QmlApplicationViewer::create()); 查看器->setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 查看器->setMainQmlFile(QLatin1String("qml/Test/main.qml")); QDeclarativeProperty propLayout(viewer->rootObject(),"layoutValue"); QDeclarativeProperty propLayoutMargin(viewer->rootObject(),"anchors.leftMargin"); qDebug() showExpanded(); 返回应用程序->执行(); }

【讨论】:

  • 感谢您提供非常详细的答案,但就像我在对问题的评论中所说的那样,此方法将要求我为我打算从中读取 LayoutMirroring 属性的任何元素添加这样的属性别名,并且它没有利用继承功能。例如,我想在此示例中读取其中一个内部矩形的 LayoutMirroring 属性的值,而不对其进行修改。
  • 其实它应该可以像其他属性anchors.leftMargin一样从C++中访问,但是不能直接访问。我已经在 Qt Developers 论坛上发表了一篇文章。他们回答我说这可能是一个错误。所以我必须将它作为一个错误提交。目前,我认为这是我唯一想到的简单方法。
  • 谢谢。也许您可以在此处发布该错误的链接。我想我想订阅,万一有人读过这个问题,他们可能也会感兴趣。
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多