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



我有Qt Creator 2.6.1。我从项目模板中创建了简单的Qt快速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快速窗口QML类型?

您正在更改qml的几何形状,而不是查看器。

  1. 查看器的几何形状可以使用QmlApplicationViewer对象来更改,您可以在主函数中创建。
  2. 但是这个对象是c++的,所以你需要向qml公开一个c++函数,并在点击这个按钮时调用这个函数。

步骤:

  1. 创建一个类,并将在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();
}

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

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

注意:我不能在onClicked中只使用parent.height—我必须通过id引用窗口。

相关内容

  • 没有找到相关文章

最新更新