2017-09-25 29 views
0

我需要从C++传递给QML一个对象来打印它。 所以,我有这样的.h:从QT C++返回一个自定义对象并在QML中打印属性

#ifndef SETTINGSOVEN_H 
#define SETTINGSOVEN_H 

#include <QObject> 
#include <objects/settings.h> 

class settingsoven : public QObject 
{ 
    Q_OBJECT 
    public: 
    explicit settingsoven(QObject *parent = nullptr); 

    Q_INVOKABLE Settings loadStartPage(); 


    Q_PROPERTY(Settings settingsObject READ getSettings WRITE setSettings NOTIFY settingsChanged) 

    signals: 
    void settingsChanged(); 

    public slots: 
    Settings getSettings(); 
    void setSettings(Settings settingsObject); 

    private: 
    Settings m_settingsObject; 
}; 

#endif // SETTINGSOVEN_H 

和我的CPP:

#include "settingsoven.h" 
#include "objects/singleton.h" 
#include "functions/jsonfunctions.h" 

settingsoven::settingsoven(QObject *parent) : QObject(parent) 
{ 

} 

Settings settingsoven::loadStartPage() 
{ 
    singleton::instance().settingsList = JsonFunctions::getConfiguration(singleton::instance().ovenClicked.id, singleton::instance().token_type, singleton::instance().access_token); 
    m_settingsObject = singleton::instance().settingsList.at(0); 
    return m_settingsObject; 
} 

Settings settingsoven::getSettings() 
{ 
    return m_settingsObject; 
} 

void settingsoven::setSettings(Settings settingsObject) 
{ 
    m_settingsObject = settingsObject; 
    emit settingsChanged(); 
} 

,并按照我的QML代码:

... 

Page { 
    width: Screen.width 
    height: Screen.height 

    Component.onCompleted: { 
     settingsOvenToQML.loadStartPage(); 
     //console.log("test:" + configuration.gmt); 

     console.log("proopertie print:" + settingsOvenToQML.settingsObject.id); 
     //i need to print here the properties 
    } 

... 

我的自定义对象,我需要在QML打印: 设置

#ifndef SETTINGS_H 
#define SETTINGS_H 

#include <QString> 
#include <QVariant> 

class Settings 
{ 
    public: 
    Settings(); 

    QString id; 
    QString gmt; 
    QVariant rtc; 
    QString thing_name; 
    QString sw_gw; 
    QVariant sw_ui; 
    QString wlan_ip_address; 
    QString eth_ip_address; 
    QString hostname; 
    qint32 mdl; 
    quint32 mdl_code; 
    quint32 tmp_unit; 
    quint32 h2o_hdns; 
    quint32 oven_no; 
    quint32 alarm_wash_to; 
    qint32 clean_to; 
    qint8 clean_notice_to; 
    qint8 decal_notice_to; 
    bool gas_test; 
    bool warn_decal_on; 
    bool warn_prb_on; 
    qint8 primary_prb; 
    qint8 time_fmt; 
    qint8 date_fmt; 
    bool preheat_otp; 
    bool cooldown_opt; 
    qint8 ext_prb_type; 
    qint8 haccp_scan; 
    bool h2o_drain; 
    bool chiller_opt; 
    QString lang; 
    qint8 backlight_lvl; 
    QString video_ver; 
    QString oven_name; 
    QString video_build; 
    QString os_ver; 
    QString os_build; 
    QString q1_ver; 
    QString q1_build; 
    QString q1_check; 
    QString q2_ver; 
    QString q2_build; 
    QString q2_check; 
    QString chill_ver; 
    QString chill_build; 
    QString chill_check; 
    QString mac_addr; 
}; 

#endif // SETTINGS_H 

我是新的qt程序员,并且我非常了解如何从qt打印对象。 我相信我的代码是正确的,但不起作用。 我在哪里错了?它可能直接在qml中从C++打印自定义对象? 有些帮助?谢谢

+0

你对“* QML *打印”有什么意义?你想访问的属性?否则,在你的'SettingsOven'中创建一个'Q_INVOKABLE printSettings()',并从QML调用它 - 你可以用QML打印它。或者你的意思是真的把它发送到打印机? – derM

+0

我的意思是我想要在qml中打印settingsObject并调用像这样的属性:settingsObject.propertie,这有可能吗? –

回答

2

我不确定你的意思是“打印”,但是如果你想能够访问一个对象的属性,它必须是QObject派生的,或者有宏,Q_GADGET,所以MOC可以生成QML需要的必要元数据以便知道对象是什么。

此外,您将不得不以某种方式公开该属性,公共成员将不能用于QML。您需要Q_PROPERTY或通过Q_INVOKABLE吸气剂返回值。

#define QPROP(type, name) \ 
    Q_PROPERTY(type name MEMBER m_##name) \ 
    type m_##name; 

class Settings { 
    Q_GADGET 
    QPROP(QString, id) 
    QPROP(QString, gmt) 
    QPROP(QVariant, rtc) 
    // and so on 
public: 
    Settings(); 
} 

Q_DECLARE_METATYPE(Settings) // last but not least 
+0

我的问题是,当我启动方法loadStartPage()时,Q_IVOKABLE不起作用,请不要返回自定义对象。 –

+0

如上所述:您需要使返回的对象(设置)成为'QObject',包括'Q_OBJECT'宏或'Q_GADGET'宏。在后一种情况下,您不能有信号(AFAIK),因此不会有绑定更新。使用'Q_OBJECT'或'Q_GADGET'可以让你拥有'Q_PROPERTY'和'Q_INVOKABLE's。使用'Q_PROPERTY',你可以使用'MEMBER'关键字来公开成员,但是你可能想要有信号,更好的方法是使用setter和getters。如果你只想把它放在'console.log'中,你将不需要信号。 – derM

+0

阅读:http://doc.qt.io/qt-5/properties.html – derM