2014-12-03 34 views
5
  1. Jak odzyskać obiekt główny (poniżej kod zwraca 0, rootContext()->findChild() również zwraca 0) z dowolnego miejsca w kod C++ (metody klasy, gdzie klasa jest zarejestrowany typ QML i definicja komponentu klasy jest bezpośrednim potomkiem katalogu głównego, zobacz objectName) i dodać wygenerowany QQuickItem w czasie wykonywania?
  2. Istnieje Myclass zarejestrowany jako typ QML. Jak dodać QML Button do sceny za pomocą najniższego kodu?

W main.qml (fragment)Get QML głównego obiektu z dowolnego miejsca w kodzie w 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()); 
//... 
} 

obrobione, ale 3) nie widzi inne obiekty main.qml.

+0

Co masz na myśli przez „gdziekolwiek”? Gdziekolwiek w QML? Gdziekolwiek w plikach C++ innych niż main.cpp? –

+0

Metoda klasy C++ – programmist

Odpowiedz

1

Nie potrzebujesz obiektu objectName.

Get element główny i sprawdzić, że jest to okno:

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

Jak uzyskać dostęp do okna głównego z metody klasy, w której klasa jest zarejestrowanym typem QML, a definicja komponentu klasy znajduje się w pliku main.qml? – programmist