2017-11-14 21 views
0

Qt QML、彼らは動作しますが、QMLリファレンスではインテリセンスはありません。インテリセンスを達成することはできますか?それを登録Qt QMLシングルトンIntellisense

pragma Singleton 
import QtQuick 2.0 
import QtQuick.Window 2.3 

Item { 
    property int iMode: 0 
    property bool bSwapLeftRight: false 

qmlRegisterSingletonType(QUrl(QLatin1String("qrc:/GlobalSettings.qml")), "ncs.global", 1, 0, "SingletonSettings"); 

第二の例;:私は二番目はシングルトンで、使用しながら、QMLでのIntelliSenseを達成

ctxt->setContextProperty("someModel", QVariant::fromValue(ownModel)); 
ctxt->setContextProperty("globalControl", QVariant::fromValue(globalControl.Get())); 

最初のものを、私はインテリセンスを達成していません。いくつかのC++定義の列挙型をQMLに公開する予定ですが、IntelliSenseが提供されていない場合は価値が失われます。Qt Quick and Creatorは基本的にシングルトンクラスのIntelliSenseをサポートしていますか?さらに検討する価値はあるか?

いくつかの詳細を追加し、メインの質問は、列挙型のではないですが、IntelliSenseは(オートコンプリート):

A few snippets: 

main.cpp: 
    //Regular Pointer 
     SomeModel* ownModel = new SomeModel(); 
    //Custom Singleton implementation 
     GlobalControlSP globalControl = GlobalControl::GetInstance(); 

    //I did not really want this line. GlobalControl should be singleton, how would this be threated? 
     qmlRegisterType<GlobalControl>("ncs.global", 1, 0, "Global"); 

    //Registering a "Pragma Singleton" file, Intellisense do not work 
     qmlRegisterSingletonType(QUrl(QLatin1String("qrc:/GlobalSettings.qml")), "ncs.global", 1, 0, "SingletonSettings"); 

     QQmlApplicationEngine engine; 
     QQmlContext* ctxt = engine.rootContext(); 

    //Regular context property, not singleton. Intellisense works 
     ctxt->setContextProperty("ownModel", QVariant::fromValue(ownModel)); 

    //Registering the singleton as context property, Intellisense do not work 
     ctxt->setContextProperty("globalControl", QVariant::fromValue(globalControl.Get())); 

     engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 

globalcontrol.h: 
class GlobalControl : public QObject, 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString backcolor READ backcolor NOTIFY backcolorChanged) 
    .... 

public: 
    GlobalControl(QObject *parent = nullptr); 
    QString backcolor() const { return m_backColor; } 
    .... 
    enum EnButton 
    { 
     DEVICE_START, 
     DEVICE_IR, 
     ..... 
    }; 
    Q_ENUM(EnButton) 

public slots: 
    void changeMode(int mode); 
    void buttonPressed(int button); 


some qml file: 

//This implementation works: 
    NcsButton { 
     property int valuent 
     id:ir 
     text: qsTr("IR") 
     width: 66 * widthScaling 
     Layout.row: 4 
     Layout.column: 1 
     fontColor: bIr ? valueColor : textColor 
     onClicked: { 
      globalControl.buttonPressed(Global.DEVICE_IR) 

//This does not work: 
    NcsButton { 
     id:ir 
     text: qsTr("IR") 
     width: 66 * widthScaling 
     Layout.row: 4 
     Layout.column: 1 
     fontColor: bIr ? valueColor : textColor 
     onClicked: { 
      globalControl.buttonPressed(globalControl.DEVICE_IR) 
+0

なぜQOPEN列挙型マクロを使用してC++列挙型を公開しないのですか? – derM

+0

私はそうしました、それはcontextpropertyを通してアクセスするとき働いていませんでした。シングルトンクラスからではありません。私がcontextpropertyとして登録された別のクラスの中で作った場合、列挙値はQMLで自動提案されましたが、うまくいきませんでした。 qmlRegisterType ( "ncs.global"、1,0、 "Global")を追加しました。 –

+0

globalControl.buttonPressed(Global.RADAR_IR)次に、同じクラスのenum Global.RADAR_IRを使用して、singleton関数globalControl.buttonPressedに渡します。私にはきれいに見えません... –

答えて

0

策や回避策は:QMLはシングルトンを定義したため

、Qtのコンパイラに追加しますQMLライブラリ生成ファイル

..\..\..\bin\qmlplugindump -relocatable ncs.global 1.0 > plugins.qmltypes 

C++登録シングルトンの場合、通常のクラスタイプの「偽」ポインタを作成します。登録。同じシングルトンクラスから列挙型を取得するには、UncreatableTypeを作成します。

GlobalControlSP globalControlOrig = GlobalControl::GetInstance(); 
    GlobalControl* globalControl = globalControlOrig.Get(); 
    ctxt->setContextProperty("globalControl", QVariant::fromValue(globalControl)); 
    qmlRegisterUncreatableType<GlobalControl>("ncs.global", 1, 0, "Global", "Singleton");