2014-04-07 25 views

Odpowiedz

12

Można użyć context properties narażać C++ obiektów QML:

#include <QtGui/QGuiApplication> 
#include <QQmlContext> 
#include <QQuickView> 
#include "qtquick2applicationviewer.h" 

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

    QtQuick2ApplicationViewer viewer; 
#ifdef QT_DEBUG 
    viewer.rootContext()->setContextProperty("debug", true); 
#else 
    viewer.rootContext()->setContextProperty("debug", false); 
#endif 
    viewer.setMainQmlFile(QStringLiteral("qml/quick/main.qml")); 
    viewer.showExpanded(); 

    return app.exec(); 
} 

main.qml:

import QtQuick 2.2 

Item { 
    id: scene 
    width: 360 
    height: 360 

    Text { 
     anchors.centerIn: parent 
     text: debug 
    } 
} 

to nie jest możliwe określenie to wyłącznie od wewnątrz QML.

2

Potrzebujesz go znać w czasie wykonywania lub podczas kompilacji? Makra są używane w czasie kompilacji, QML jest wykonywane w środowisku wykonawczym, więc nie ma różnicy dla skompilowanej aplikacji pomiędzy "debugowaniem" a "zwolnieniem".

Rozwiązanie:

Create a class with const property declared in next way: 
class IsDebug : public QObject 
{ 
    QOBJECT 
    Q_PROPERTY(IsDebug READ IsCompiledInDebug) // Mb some extra arguments for QML access 
public: 
    bool IsCompiledInDebug() const { return m_isDebugBuild; } 
    IsDebug() 
#ifdef QT_DEBUG 
    : m_isDebugBuild(true) 
#else 
    : m_isDebugBuild(false) 
#endif 
    {} 
private: 
    const bool m_isDebugBuild; 
} 
+0

rozwiązanie Mitcha jest bardziej zwięzły, nie trzeba mieć dodatkową QObject za to. –

+0

@FrankOsterfeld 1) Moje rozwiązanie zawiesza wszystkie aplikacje, nie tylko część QML. 2) Odpowiedzieliśmy na nasze odpowiedzi w tym samym czasie. Nie widziałem tego, zanim napisałem własną. –