Как программно изменить геометрию главного окна во время выполнения по отношению к QML?

У меня 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
    }
}

Если я нажму на прямоугольник, он должен уменьшиться вдвое. И это происходит, но окно не уменьшается.

Какое лучшее решение, если я хочу, чтобы главное окно повторяло геометрию основного прямоугольника qml?

ОБНОВИТЬ. Одно решение было найдено. См. ответ Амита Томара. Но существует более простое решение, например, с использованием QtQuick 5.0: Типы QML Qt Quick Window ?


person synacker    schedule 19.01.2013    source источник


Ответы (2)


Вы меняете геометрию своего qml, а не средства просмотра. Для этого:

  1. Геометрию средства просмотра можно изменить с помощью объекта QmlApplicationViewer, который вы бы создали в своей основной функции.
  2. Но этот объект находится на C++, поэтому вам нужно предоставить функцию C++ для qml и вызвать эту функцию при нажатии этой кнопки.

Шаги:

  1. Создайте класс и сохраните объект Application Viewer, созданный в main.cpp, внутри этого класса для дальнейших вызовов.
  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();
}

мой класс.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)
        }
    }
}
person Amit Tomar    schedule 19.01.2013
comment
Да это работа! Но существует ли более простое решение? Например, используя QtQuick 5.0: Qt Quick Window QML Types? - person synacker; 20.01.2013

Элемент управления рабочего стола ApplicationWindow позволяет изменять размер окна по своему усмотрению:

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

Примечание. Я не мог использовать только parent.height в onClicked — мне приходилось обращаться к окну по идентификатору.

person pixelgrease    schedule 03.04.2014