2014-07-13 18 views
5


Sto scrivendo un'app Qt.
Ho separato la mia app da un frontend QML e un backend del plugin C++.
Nel mio plugin C++ ho una classe astratta Session che vorrei esporre a QML e ho anche alcune implementazioni di quella classe.
Vorrei che il mio frontend QML conoscesse solo la classe Session e non si preoccupasse delle specifiche del tipo di sessione.
Ho provato alcune varianti di qmlRegister * per registrare il mio tipo di sessione con QML ma Session deve essere concreto (come nel caso di qmlRegisterType) o registra bene ma semplicemente non posso riferire al tipo di sessione da QML come in property Session session senza nemmeno creazione di istanze di una sessione da QML.
Qualcuno sa come dovrei avvicinarmi a questo?Registrare una classe astratta C++ in un plugin QML e fare riferimento ad esso da QML

UPDATE:
Un esempio di ciò che non ha funzionato:
In main.cpp:

char const* const uri = "com.nogzatalz.Downow"; 
qmlRegisterUncreatableType<downow::Session>(uri, 1, 0, "Session", "Abstract type"); 

In DowNow.qml:

import QtQuick 2.0 
import com.nogzatalz.Downow 1.0 

Item { 
    property Session session 
} 
+0

Si dovrebbe aggiungere che cosa esattamente si è tentato e che cosa wend sbagliato. Inoltre, cosa intendi con "alcune implementazioni di quella classe" – labsin

+0

Ho provato a registrare la classe astratta Session usando qmlRegisterType/qmlRegisterInterface/qmlRegisterUncreatableType. Poi ho provato a tenere un oggetto Session come una proprietà in QML ma non funziona. Con "alcune implementazioni di quella classe" intendo che la classe astratta Session ha alcune classi concrete che la ereditano. –

+0

Hai trovato qualche soluzione per il prolem? Mi sto occupando di un problema simile. – likeToCode

risposta

1

Per quanto so che è impossibile creare una variabile usando una classe astratta come definizione.

È possibile dichiarare la variabile di sessione come QtObject nel codice qml, si perderà semplicemente la funzione di completamento automatico di qtcreator.
Tuttavia, tutte le proprietà dichiarano con la macro Q_PROPERTY e tutte le funzioni Q_INVOKABLE saranno comunque disponibili in fase di esecuzione.

Se si desidera avere quasi la stessa semantica, suggerisco di creare una classe C++ singleton che si registra su QML utilizzando qmlRegisterSingletonType e che tale classe porti la variabile "sessione". Quindi tenere il qmlRegisterUncreatableType sulla vostra classe astratta Session, in questo modo nel codice QML si sarà in grado di scrivere qualcosa di simile:

MySingleton.session 

e mantenere l'auto-completamento per QML all'interno QtCreator.
Come bonus sarà anche possibile creare un segnale "SessionChanged" se i tuoi utenti possono accedere/uscire più volte senza riavviare l'app.

0

Ho ottenuto questo lavoro con qmlRegisterInterface. mia chiamata virtuale è InputDeviceConfigurator:

class InputDeviceConfigurator : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit InputDeviceConfigurator(QObject *parent = 0); 
    Q_INVOKABLE virtual QString deviceId() = 0; 
} 

posso registrarmi come segue:

qmlRegisterInterface<InputDeviceConfigurator>("InputDeviceConfigurator"); 

E quindi utilizzare un JoystickConfigurator classe ereditata:

class JoystickConfigurator : public InputDeviceConfigurator 
{ 
public: 
    JoystickConfigurator(JoystickDevice * device); 

    // InputDeviceConfigurator interface 
    virtual QString deviceId() override; 
} 

E quanto posso usarlo:

Component.onCompleted: console.log(UserInputManagement.getConfigurator().deviceId()) 

UserInputManagement è solo un Singleton con:

Q_INVOKABLE InputDeviceConfigurator * getConfigurator();