2013-01-19 7 views
5

Ho Qt Creator 2.6.1. Ho creato semplice progetto Qt Qucik 2.0 da modelli di progetto e cambiato il file main.qml su questo:Come modificare la geometria della finestra principale a livello di programmazione in fase di esecuzione w.r.t QML?

import QtQuick 2.0 

Rectangle { 
    width: 360 
    height: 360 

    color: "red" 

    MouseArea { 
     anchors.fill: parent 
     onClicked: parent.height = 180 
    } 
} 

se riuscirò a cliccare sul rettangolo di esso dovrebbe essere ridotta a metà. E si è verificato, ma la finestra non è ridotta.

Qual è la soluzione migliore, se voglio che la finestra principale debba ripetere la geometria del rettangolo principale qml?

AGGIORNAMENTO. Una soluzione è stata trovata. Vedi la risposta di Amit Tomar. Ma esiste una soluzione più semplice, ad esempio usando QtQuick 5.0: Qt Quick Window QML Types?

risposta

6

Si sta modificando la geometria del qml, non del Viewer. Per fare ciò:

  1. La geometria del visualizzatore può essere modificata utilizzando l'oggetto QmlApplicationViewer che avresti creato nella funzione principale.
  2. Ma quell'oggetto è in C++, quindi è necessario esporre una funzione C++ a qml e chiamare tale funzione al clic di questo pulsante.

Passi:

  1. Creare una classe e memorizzare l'oggetto spettatore applicazione creata nel main.cpp, all'interno di questa classe per le chiamate successive.
  2. Expose a function in this class to qml. Questa funzione deve essere in grado di modificare la dimensione utilizzando l'oggetto visualizzatore applicazioni memorizzato nella classe.
  3. Al clic del rettangolo qml, chiamare questa funzione.

main.cpp

#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 
#include "qdeclarativecontext.h" 

#include "myclass.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QmlApplicationViewer *viewer = new QmlApplicationViewer(); 

    MyClass myClassObject(viewer); 
    viewer->rootContext()->setContextProperty("myViewer", &myClassObject); 
    viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer->setMainQmlFile(QLatin1String("qml/untitled/main.qml")); 
    viewer->showExpanded(); 

    return app.exec(); 
} 

MyClass.h

#ifndef MYCLASS_H 
#define MYCLASS_H 

#include "qmlapplicationviewer.h" 

class MyClass : public QObject 
{ 
    Q_OBJECT 

public: 

    MyClass(QmlApplicationViewer * p) { internalViewer = p ; } 
    Q_INVOKABLE void viewerResize(int x, int y, int length, int breadth) 

    { 
     internalViewer->setGeometry(internalViewer->x(),internalViewer->y(),length,breadth); 
    } 

private: 

    QmlApplicationViewer *internalViewer; 
}; 

#endif // MYCLASS_H 

main.qml

import QtQuick 1.0 

Rectangle { 
    width: 360 
    height: 360 
    Text { 
     text: "Hello World" 
     anchors.centerIn: parent 
    } 
    MouseArea { 
     anchors.fill: parent 
     onClicked: 
     { 
      myViewer.viewerResize(0,0,110,110) 
     } 
    } 
} 
+0

Sì, questo è lavoro! Ma esiste una soluzione più semplice? Ad esempio, utilizzando "QtQuick 5.0: QM Qt Quick Window Tipi"? – Milovidov

2

Il controllo del desktop ApplicationWindow vi dà la possibilità finestra di dimensionamento si desidera :

import QtQuick 2.0 
import QtQuick.Controls 1.0 

ApplicationWindow { 
    id: container 
    width: 360 
    height: 360 
    color: "Red" 

    MouseArea { 
     anchors.fill: parent 
     onClicked: container.height = 180 
    } 
} 

Nota: non ho potuto usare solo parent.height in onClicked - ho dovuto fare riferimento alla finestra da id.