2013-01-19 18 views
5

Qt Creator 2.6.1 var. Ben proje şablonlardan basit Qt Qucik 2.0 projeyi oluşturdu ve bu konuda main.qml dosyayı değiştirdi: i dikdörtgen tıklayın olacaksaAna pencerenin geometrisi çalışma zamanında programatik olarak nasıl değiştirilir w.r.t QML?

import QtQuick 2.0 

Rectangle { 
    width: 360 
    height: 360 

    color: "red" 

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

o yarısında azaltılmalıdır. Ve ortaya, ancak pencere azalmaz.

Ana pencerenin ana qml dikdörtgenin geometrisini tekrarlaması gerekiyorsa, en iyi çözüm hangisidir?

UPDATE. Bir çözüm bulundu. Amit Tomar cevabına bakınız. Ama daha kolay bir çözüm var, örneğin QtQuick 5.0: Qt Quick Window QML Types kullanıyor?

cevap

6

Görüntüleyiciniz değil, qml'nizin geometrisini değiştiriyorsunuz. Bunu yapmak için: izleyicinin

  1. Geometri QmlApplicationViewer kullanılarak değiştirilebilir Eğer ana işlevi oluşturulan olurdu nesnesi.
  2. Ancak bu nesne C++ 'da olduğundan, bir C++ işlevini qml'ye göstermeniz ve bu düğmeyi tıklatarak bu işlevi çağırmanız gerekir.

Adımlar:

  1. bir sınıf oluşturun ve daha ileri aramalar için bu sınıf içinde main.cpp oluşturulan Uygulama izleyici nesnesi, depolar. Bu işlev, sınıfta depolanan uygulama görüntüleyici nesnesini kullanarak boyutu değiştirebilmelidir.
  2. qml dikdörtgeni tıklattığınızda, bu işlevi çağırınız.

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

Evet, iş budur! Fakat daha kolay bir çözüm var mı? Örneğin, "QtQuick 5.0: Qt Quick Window QML Types" kullanarak? – Milovidov

2

ApplicationWindow masaüstü kontrolü size istediğiniz pencere boyutlandırma yeteneği kazandırır :

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

Not: Sadece parent.heightonClicked yılında kullanamadı - Ben kimliğiyle penceresine başvuruda zorunda kaldı.

İlgili konular