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

时间:2013-01-19 21:01:50

标签: 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
    }
}

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

    1. 创建一个类并存储在main.cpp中创建的Application查看器对象,在此类中进行进一步调用。
    2. Expose a function in this class to qml.此函数应能够使用存储在类中的应用程序查看器对象来修改大小。
    3. 点击qml矩形,调用此函数。
    4. 的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)
              }
          }
      }
      

答案 1 :(得分:2)

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 - 我必须通过ID引用该窗口。