【问题标题】:C++ and QML integration, can't seem to access propertiesC++ 和 QML 集成,似乎无法访问属性
【发布时间】:2011-09-30 15:44:09
【问题描述】:

好的。所以我以为我已经完全理解了这一点,但显然我做错了什么,我一生都无法理解。我已经严格按照教程进行操作(我检查过),但无法让它工作,所以在这里,让我问一个简单的问题。

我创建了一个基于 QObject 的类,它有一个简单的 QString 变量来存储类的名称(这只是为了测试),它看起来像这样:

#include <QObject>

class CategoryPane : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString catName READ getCategoryName WRITE setCategoryName);

public:
    explicit CategoryPane(QObject *parent = 0);

    QString getCategoryName();
    void setCategoryName(QString);

signals:
    void nameChange();

private:
    QString categoryName;
};

这是使用以下函数注册的:qmlRegisterType("ITI_UI", 1, 0, "CategoryPane");

我正在尝试在如下所示的 QML 文件中打印出 CategoryPane 类的名称变量:

import QtQuick 1.0
import ITI_UI 1.0

Rectangle {
    width: 300
    height: 300

    CategoryPane {
        id: whatever
        catName: "ey"
        Text {
            text: whatever.catName
        }
    }
}

但我收到以下错误:qrc:/main.qml:11:3: 无法分配给不存在的默认属性

注意:如果我删除 Text {} 字段,我不会收到错误消息,但是我又无法打印出我的名字字符串,这是重点...

提前感谢您的时间和耐心!

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    CategoryPane 被用作视觉项目,但它派生自 QObject。您是否尝试过从 QDeclarativeItem 继承?

    如果您只想访问该属性而不将其用作可视项,您应该可以这样做:

    C++:

    QDeclarativeView view;
    CategoryPane pane;
    view.rootContext()->setContextProperty("categoryPane", &pane);
    

    QML:

    import QtQuick 1.0
    
    Rectangle {
        width: 300
        height: 300
    
        Text {
            text: categoryPane.catName
        }
    }
    

    【讨论】:

    • 我实际上是在昨晚提出问题后大约两个小时才弄清楚的,我必须从 QDeclarativeItem 继承 :) 不过不知道 rootContext() 方法,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多