2015-02-11 11 views
2

如何在Qt中的QML文件中使用C++類變量。我想在C++文件中設置一個基於Q_OS_Android的變量並評估QML文件中的條件。這將如何成爲可能?在QML文件中使用C++類變量

回答

5

你必須在你的頭文件中聲明該變量爲屬性並在你的main中用qml註冊這個類。下面是一個類Foo和可變的QString VAR的例子:

class Foo : ... 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString var READ getVar WRITE setVar NOTIFY varChanged) 

public: 
    Foo(); 
    ~Foo(); 

    QString getVar() const {return m_var;} 
    void setVar(const QString &var); 

signals: 
    void varChanged(); 

public slots: 
    //slots can be called from QML 
private: 
    QString m_var; 
}; 

在主你有這樣的事情:

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    qmlRegisterType<Foo>("MyApp", 1, 0, "Foo"); 

    QQuickView view; 
    view.setSource(QUrl("qrc:/main.qml")); 
    view.show(); 
    return app.exec(); 
} 

在你設爲Qml文件,你可以使用簡單的導入類:

import MyApp 1.0 

然後使用你的類,你將任何正常的QML類型:

Foo{ 
    id: myClass 
    var: "my c++ var" 
    ... 
} 
+2

你的回答是正確的,但我不確定什麼「//只能從QML調用插槽」。如果標記爲Q_INVOKABLE且Qml中註冊了參數和返回類型,則可以從Qml調用任何函數。 – 2015-02-11 09:48:55

+1

是的,你是對的。但是我發現只使用插槽就簡單多了,因爲它們可以從QML調用,而無需註冊或標記它們! PS:我會從我的答案中刪除「唯一」;) – luffy 2015-02-11 09:54:12

+0

你可以更簡單地找到它,但是'Q_INVOKABLE'很重要。例如。你可以給'Q_INVOKABLE'標記'QAbstractListModel'派生類的方法,並在QML中使用它們,而不是爲原始類中的方法添加「QML-friendly」包裝方法。這是介紹'Q_INVOKABLE'的主要目的之一。 – BaCaRoZzo 2015-02-11 10:23:58