如何在运行时以编程方式更改主窗口的几何形状?

syn*_*ker 5 qt qml qt-quick qt5 qtquick2

我有Qt Creator 2.6.1.我从项目模板创建了简单的Qt Qucik 2.0项目并更改了main.qml文件:

import QtQuick 2.0

Rectangle {
    width: 360
    height: 360

    color: "red"

    MouseArea {
        anchors.fill: parent
        onClicked: parent.height = 180
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我点击矩形,它应该减少一半.它发生了,但窗口没有减少.

什么是最佳解决方案,如果我想要主窗口必须重复主qml矩形的几何?

UPDATE.找到了一个解决方案.见Amit Tomar回答.但是存在更简单的解决方案,例如,使用QtQuick 5.0:Qt Quick Window QML Types

Ami*_*mar 6

您正在更改qml的几何图形,而不是Viewer.为此:

  1. 可以使用您在main函数中创建的QmlApplicationViewer对象更改查看器的几何.
  2. 但是这个对象是用C++编写的,所以你需要将一个C++函数暴露给qml,并在点击这个按钮时调用该函数.

脚步:

  1. 创建一个类并存储在main.cpp中创建的Application查看器对象,在此类中进行进一步调用.
  2. 将此类中的函数公开给qml.此函数应能够使用存储在类中的应用程序查看器对象来修改大小.
  3. 单击qml矩形,调用此函数.

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();
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)