2014-12-03 7 views
5
  1. Come recuperare un oggetto radice (il codice sottostante restituisce 0, rootContext()->findChild() restituisce anche 0) da qualsiasi posizione in un codice C++ (un metodo di classe in cui la classe è un tipo QML registrato e la definizione del componente classe è un figlio diretto della radice, vedere objectName) e aggiungere un QQuickItem generato in fase di runtime?
  2. C'è myclass registrato come tipo QML. Come aggiungere un QML Button alla scena usando il codice più in basso?

Nel main.qml (frammento)Ottieni oggetto radice QML da qualsiasi posizione in un codice in Qt 5.3

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    objectName: root 

    visible: true 
    width: 360 
    height: 100 

    // ... 
} 

MyClass.cpp

void myclass::add_hip() 
{ 
    setProperty("hip", 87); 

    QQmlEngine *engine = QtQml::qmlEngine(this); 

// QObject *root = engine->rootContext()->findChild<QObject*>("womanObj"); 
    QQuickWindow *window = qobject_cast<QQuickWindow *>(root); 
    QObject *wobj = window->findChild<QObject *>("womanObj"); 
    // 1. Define a QML component. 
    QQmlComponent *readHipComp = new QQmlComponent(engine); 
    readHipComp->setData("import QtQuick.Controls 1.2\n\ 
         Button {\n\ 
          anchors.top: addHipBtn.top\n\ 
          anchors.left: addHipBtn.left\n\ 
          anchors.margins: 3\n\ 
          text: \"Hip value\"\n\ 
          onClicked: {\n\ 
           msgDlg.text = myclass.hip\n\ 
           msgDlg.open()\n\ 
          }\ 
         }", QUrl()); 
    // 2. Create the component instance. 
    QQuickItem *readHipBtn = qobject_cast<QQuickItem *>(readHipComp->create()); 
    // 3. Add the instance to the scene. 
// readHipBtn->setParentItem(qobject_cast<QQuickItem *>(engine->rootContext()->contextObject())); 

// QObject *root = QtQml::qmlContext(this)->findChild<QQuickItem *>("root"); 
// readHipBtn->setParent(root); 
} 

UPDATE

extern QQuickWindow *window; 
void myclass::add_hip() 
{ 

    //... 
readHipBtn->setParentItem(window->contentItem()); 
//... 
} 

lavorato, ma 3.) Non vede altri oggetti main.qml.

+0

Cosa si intende per "ovunque"? Ovunque in QML? Ovunque nei file C++ diversi da main.cpp? –

+0

Metodo classe C++ – programmist

risposta

1

Non è necessario l'oggettoName.

elemento principale Get e verificare che si tratta di una finestra:

QQmlApplicationEngine engine; 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
QObject *root = engine.rootObjects()[0]; 

QQuickWindow *window = qobject_cast<QQuickWindow *>(root); 
if (!window) { 
    qFatal("Error: Your root item has to be a window."); 
    return -1; 
} 
window->show(); 
+0

Come accedere alle finestre root da un metodo di classe in cui la classe è un tipo QML registrato e la definizione del componente classe è nel file main.qml? – programmist

Problemi correlati