2013-01-19 19 views
5

Mam Qt Creator 2.6.1. Stworzyłem prostą Qt Qucik 2.0 projekt z szablonów projektowych i zmienił plik main.qml na ten temat:Jak programowo zmienić geometrię okna głównego w czasie wykonywania w.r.t QML?

import QtQuick 2.0 

Rectangle { 
    width: 360 
    height: 360 

    color: "red" 

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

Jeśli będę kliknij na prostokąt powinien zostać zmniejszony o połowę. I to się dzieje, ale okno nie jest zmniejszone.

Co jest najlepszym rozwiązaniem, jeśli chcę, aby to główne okno musiało powtarzać geometrię głównego prostokąta qml?

AKTUALIZACJA. Znaleziono jedno rozwiązanie. Zobacz odpowiedź Amit Tomar. Ale istnieje łatwiejsze rozwiązanie, na przykład, używając QtQuick 5.0: Qt Quick Window QML Types?

Odpowiedz

6

Zmieniasz geometrię swojego qml, a nie przeglądarki. Aby to zrobić:

  1. Geometria przeglądarki może zostać zmieniona za pomocą obiektu QmlApplicationViewer, który zostałby utworzony w głównej funkcji.
  2. Ale ten obiekt jest w C++, więc musisz odsłonić funkcję C++ do qml i wywołać tę funkcję po kliknięciu tego przycisku.

Kroki:

  1. utworzyć klasę i przechowywać obiekt widza aplikacja stworzona w main.cpp, wewnątrz tej grupy do dalszych rozmów.
  2. Expose a function in this class to qml. Ta funkcja może modyfikować rozmiar przy użyciu obiektu przeglądarki aplikacji przechowywanego w klasie.
  3. Po kliknięciu prostokąta qml wywołaj tę funkcję.

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

Tak, to jest praca! Ale czy istnieje łatwiejsze rozwiązanie? Na przykład, używając "QtQuick 5.0: Qt Quick Window QML Types"? – Milovidov

2

ApplicationWindow Desktop Control daje możliwość zmiany rozmiaru okna, które chcesz :

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 
    } 
} 

Uwaga: Nie można użyć tylko parent.height w onClicked - Musiałem odwołać się do okna przez id.

Powiązane problemy