QML <1> Item 布局 属性

QML <1> Item 布局 属性

一、Item 文档描述

The Item type is the base type for all visual items in Qt Quick.
All visual items in Qt Quick inherit from Item. Although an Item object has no visual appearance, it defines all the attributes that are common across visual items, such as x and y position, width and height, anchoring and key handling support.

Item 类型是 Qt Quick 中所有可视项的基本类型。
Qt Quick 中的所有可视项都继承自 Item。 尽管 Item 对象不可视,但它定义了所有视觉项的通用属性,例如 x 和 y 位置、宽度和高度、锚定和关键处理支持。

二 、 anchor

只能用于父子关系控件 或者 同级控件
锚线:
在这里插入图片描述
锚边距:
在这里插入图片描述
锚偏移:
horizontalCenterOffset 水平中心的偏移
verticalCenterOffset 垂直中心的偏移
baselineOffset 基线的偏移

baseline :基线对应于文字所在的假想线。对于没有文字的项目,它与顶部相同

三、 LayoutMirroring

默认布局方式 left -> right 启用改属性 可还未 right -> left
childrenInherit 确定子控件是否启用镜像布局

 import QtQuick 2.12
import QtQuick.Window 2.12
import "./Custom"
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World") 
    CustomWidget
    {
        anchors.centerIn:  parent
        width:   400
        height:  80
    }
}

CustomWidget.qml

Rectangle
 {
     id:root
     LayoutMirroring.enabled: true //启用镜像布局
     LayoutMirroring.childrenInherit: true// 镜像布局 向下传递
     Row
     {
         spacing: 5
         Repeater
         {
             model:6
             Rectangle
             {
                 width: 60
                 height: 40
                 color: "red"
                 Text {
                     text: index
                     anchors.centerIn: parent
                 }
                 opacity: index /6
             }
         }
     }
 }
 LayoutMirroring.enabled: true //启用镜像布局
// LayoutMirroring.childrenInherit: true// 镜像布局 向下传递

在这里插入图片描述

 LayoutMirroring.enabled: true //启用镜像布局
  LayoutMirroring.childrenInherit: true// 镜像布局 向下传递

在这里插入图片描述

四、Z 属性

QT 文档描述:
Sets the stacking order of sibling items. By default the stacking order is 0.
Items with a higher stacking value are drawn on top of siblings with a lower stacking order. Items with the same stacking value are drawn bottom up in the order they appear. Items with a negative stacking value are drawn under their parent’s content.

设置同级项的堆叠顺序。 默认情况下,堆叠顺序为 0。
具有较高堆叠值的项目绘制在具有较低堆叠顺序的同级项之上。

Rectangle {
        z:10
        color: "red"
        x: 10; y: 10 ;width: 100; height: 100
    }
    Rectangle {
        z:5
        color: "blue"
        x: 60; y: 60; width: 100; height: 100
    }

在这里插入图片描述

具有相同堆叠值的项目按照它们出现的顺序自下而上绘制。
Rectangle { color: "red" x: 10; y: 10 ;width: 100; height: 100 } Rectangle { color: "blue" x: 60; y: 60; width: 100; height: 100 }在这里插入图片描述

具有负堆叠值的项目将绘制在其父项的内容下。

 Rectangle {
        z:10
        color: "red"
        x: 10; y: 10 ;width: 100; height: 100
    }
    Rectangle
    {
        z:5
        color: "green"
         x: 60; y: 60; width: 100; height: 100

         Rectangle {
             z:-1
             color: "blue"
             width: 200; height: 200
             anchors.centerIn: parent
         }
    }

在这里插入图片描述

参考

https://baijiahao.baidu.com/s?id=1669437447643050469&wfr=spider&for=pc
https://blog.csdn.net/gelin520gelin/article/details/32709559

可以通过自定义 QQuickItem 实现自定义分割布局。具体实现步骤如下: 1. 创建一个自定义 QQuickItem,并在其内部添加子项,用于显示布局的内容。 2. 为自定义 QQuickItem 添加属性,用于控制布局的分割位置和方向。 3. 在自定义 QQuickItem 实现布局算法,根据分割位置和方向,计算子项的位置和大小。 4. 在 QML 使用自定义 QQuickItem,设置其属性,即可实现自定义分割布局。 下面是一个简单的自定义分割布局示例(仅实现横向分割): ```cpp // SplitterItem.h #include <QQuickItem> class SplitterItem : public QQuickItem { Q_OBJECT Q_PROPERTY(QQuickItem* leftItem READ leftItem WRITE setLeftItem NOTIFY leftItemChanged) Q_PROPERTY(QQuickItem* rightItem READ rightItem WRITE setRightItem NOTIFY rightItemChanged) Q_PROPERTY(int splitPos READ splitPos WRITE setSplitPos NOTIFY splitPosChanged) public: SplitterItem(QQuickItem *parent = nullptr); QQuickItem* leftItem() const; void setLeftItem(QQuickItem *item); QQuickItem* rightItem() const; void setRightItem(QQuickItem *item); int splitPos() const; void setSplitPos(int pos); signals: void leftItemChanged(); void rightItemChanged(); void splitPosChanged(); protected: QSGNode* updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) override; private: QQuickItem *m_leftItem; QQuickItem *m_rightItem; int m_splitPos; }; ``` ```cpp // SplitterItem.cpp #include "SplitterItem.h" #include <QSGGeometryNode> #include <QSGGeometry> #include <QSGFlatColorMaterial> SplitterItem::SplitterItem(QQuickItem *parent) : QQuickItem(parent) , m_leftItem(nullptr) , m_rightItem(nullptr) , m_splitPos(0) { setFlag(ItemHasContents, true); } QQuickItem* SplitterItem::leftItem() const { return m_leftItem; } void SplitterItem::setLeftItem(QQuickItem *item) { if (m_leftItem != item) { m_leftItem = item; emit leftItemChanged(); } } QQuickItem* SplitterItem::rightItem() const { return m_rightItem; } void SplitterItem::setRightItem(QQuickItem *item) { if (m_rightItem != item) { m_rightItem = item; emit rightItemChanged(); } } int SplitterItem::splitPos() const { return m_splitPos; } void SplitterItem::setSplitPos(int pos) { if (m_splitPos != pos) { m_splitPos = pos; emit splitPosChanged(); update(); } } QSGNode* SplitterItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { QSGGeometryNode *node = nullptr; QSGGeometry *geometry = nullptr; QSGFlatColorMaterial *material = nullptr; if (!oldNode) { node = new QSGGeometryNode; geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 4); geometry->setDrawingMode(GL_TRIANGLE_STRIP); node->setGeometry(geometry); material = new QSGFlatColorMaterial; node->setMaterial(material); } else { node = static_cast<QSGGeometryNode*>(oldNode); geometry = node->geometry(); material = static_cast<QSGFlatColorMaterial*>(node->material()); } QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D(); QRectF rect = boundingRect(); // 计算左侧和右侧子项的宽度和高度 qreal leftWidth = m_splitPos; qreal rightWidth = rect.width() - m_splitPos; qreal height = rect.height(); // 更新左侧子项的位置和大小 if (m_leftItem) { m_leftItem->setPos(0, 0); m_leftItem->setSize(QSizeF(leftWidth, height)); } // 更新右侧子项的位置和大小 if (m_rightItem) { m_rightItem->setPos(leftWidth + 1, 0); m_rightItem->setSize(QSizeF(rightWidth, height)); } // 更新分割线的位置和大小 vertices[0].set(leftWidth, 0); vertices[1].set(leftWidth, height); vertices[2].set(leftWidth + 1, 0); vertices[3].set(leftWidth + 1, height); // 设置分割线的颜色 material->setColor(Qt::gray); node->markDirty(QSGNode::DirtyGeometry); return node; } ``` 在 QML 使用 SplitterItem: ```qml SplitterItem { width: 400 height: 300 leftItem: Rectangle { color: "red" } rightItem: Rectangle { color: "green" } splitPos: 200 } ``` 以上代码实现了一个横向分割的布局,左侧子项为红色矩形,右侧子项为绿色矩形,分割线位置为 200。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值