2015-07-29 14 views
5

considerare questo semplice classe enum:Assegnazione o modifica proprietà int utilizzando enum all'interno QML

#include <QObject> 
class BookTypes : public QObject 
{ 
    Q_GADGET 
    Q_ENUMS(AllBooksType)  

public: 

    enum AllBooksType{ 
     eMagazine, 
     eReference, 
     eTextBook, 
     eThesis 
    }; 

signals: 

public slots: 

}; 

registrazione Digitare main()

qmlRegisterUncreatableType<BookTypes>("trial", 1, 0, "BookTypes", 
"Don't create qml instance for BookTypes"); 

e questo è campione QML:

Rectangle { 
     id: rect 
     x: 100; y: 100 
     width: 100 
     height: 70 
     color: "PowderBlue" 
     border.color: "RoyalBlue" 
     border.width: 1 
     radius: 3 

     MouseArea{ 
      x: 0; y: 0 
      height: parent.height 
      width: parent.width 
      property int bt: BookTypes.eTextBook //perfect. now bt is 2 
      onClicked: { 
       console.debug("old book type:- ") 
       console.debug(bt) //prints 2 
       console.debug("selected book type:- ") 
       bt = BookTypes.eReference //gives error - why ? 
       console.debug(BookTypes.eReference) //prints 'undefined' 
       console.debug(bt) 
      } 
     } 
    } 

Questo significa che l'enum è correttamente esposto, poiché inizializza con successo bt y in

property int bt: BookTypes.eTextBook 

Quello che non capisco è: perché non è accessibile quando provo a sostituire il valore della bt nel gestore:

bt = BookTypes.eReference //gives error - why ? 

Come faccio a passare una tale enum come argomento di Q_INVOKABLE metodo, ad esempio:

console.debug(BookTypes.eReference) //prints 'undefined' 
SomeObj.someCPPMethod(BookTypes.eReference) // sends 'undefined' and defaults to 0 
+2

A proposito, Q_GADGET è "una versione più leggera della macro Q_OBJECT per le classi che non ereditano da QObject ma vogliono comunque utilizzare alcune delle funzionalità di riflessione offerte da QMetaObject." Non sono sicuro che derivare da QObject sia una buona idea; probabilmente dovresti fare l'una o l'altra. – Mitch

+0

sì @ Mitch Grazie! Questo snippet è una delle parti di prova ed errore. Nel codice reale userò QObjects ovunque. – essbeev

risposta

5

Tratto da docs:

Nota: i nomi dei valori enum devono iniziare con una lettera maiuscola per essere accessibili da QML.

Il che fa sorgere la domanda: perché funziona nel vincolo di proprietà? Non ne ho idea, probabilmente un bug Qt.

+1

Buon Dio! Grazie mille !! questo è un risparmiatore di vita .. @ cmannett85 – essbeev