Use of QML/Qt Quick anchors.fill

introduction

QML and Qt Quick

QML is the programming language of Qt Quick, a concise, declarative programming language for building dynamic and cross-platform user interfaces. QML is designed to simplify UI development, make development faster, and improve collaboration between design and development teams. QML combines an easy-to-read JSON-type syntax, powerful property binding and Javascript capabilities to provide developers with an efficient framework focused on UI layout and logic.

Qt Quick is a C++ library for building high-performance, animated and touch-friendly user interfaces based on QML. With Qt Quick, you can benefit from rich graphical effects while leveraging its powerful Model-View-Controller (MVC) pattern to create dynamic and data-driven applications. Qt Quick is also written in C++, which explains its excellent performance. Qt Quick also provides scalability and cross-platform support for applications, including desktop, mobile and embedded devices.

Together, QML and Qt Quick enable developers and designers to create engaging user interfaces faster while maintaining application performance and maintainability. In practice, this has led to a major breakthrough in UI development, enabling users to design impressive and interactive experiences.

The concept of anchor layout

Anchor layout is a layout method in QML that allows the relative position relationship between elements to be defined based on the edges or baselines of other elements (such as parent or sibling elements). This layout method embodies responsive design principles, enabling the user interface to adapt to different window sizes and device screens. Anchor Layout simplifies the job of layout management, allowing developers to focus on creating dynamic and touch-oriented interactive experiences.

In QML, anchor layout is done through anchorsthe attribute . This set of properties allows you to establish constraints between elements, such as aligning the left edge of one element with the right edge of another, or aligning the tops of two elements. Through these relationships, you can ensure that the layout of child elements remains consistent regardless of changes in the size of the parent container.

Anchor layout provides multiple attributes, such as: left, right, top, bottom, horizontalCenterand verticalCenter, which are used to define the positional relationship between elements. In addition, you anchors.fillcan anchors.centerInquickly set the layout through the and attributes, so that the element fills the available space of the parent container or aligns the element in the center.

To sum up, anchor layout is the core concept of QML, which enables developers to easily implement responsive and adaptive user interface layout.

anchors.fill Property

anchors.fillis an attribute in QML Anchor Layout that simplifies the process of filling child elements into the entire available space of the parent or referenced element. When you use anchors.fillthe attribute , all edges (left, right, top, bottom) of child elements are automatically aligned with the corresponding edges of the parent or referenced element.

This property is actually a shortcut to set the anchor properties ( anchors.left, anchors.right, anchors.top, anchors.bottom) in the four directions of the child element to match the edge of the parent element or the reference element at the same time.

Using anchors.fillcan speed up the development of layouts and ensure that elements remain adaptive within the available space of the parent container. The following example shows how to use anchors.fillthe attribute :

import QtQuick 2.15

Rectangle {
    width: 640
    height: 480
    color: "lightgray"

    Rectangle {
        id: innerRectangle
        color: "blue"
        anchors.fill: parent
        anchors.margins: 20 // 可选,设置与父元素边缘的间距。
    }
}

In this example, anchors.fill: parentit is specified innerRectanglethat should fill the entire available space of its parent element ( Frame ), while anchors.marginsadding spacing from the edge of the parent element by definition. This makes it easy to ensure that child elements always fit within the size of the parent element.

QML Anchor Layout Basics

Anchor properties (left, right, top, bottom)

In QML, anchor properties are used to determine the layout of an element relative to another element or its parent. Anchor properties include left, right, top, and bottom, which are used to specify the positional relationship of elements in the horizontal and vertical directions, respectively. These anchor properties allow you to easily define layout rules for child elements relative to the edges of their parent or sibling elements. The following is a detailed description of each anchor property:

  1. anchors.left- This property is used to align the left edge of an element with the left or right edge of another element such as a parent element or a sibling element. For example, you could anchor the left edge of a button to the left edge of a parent element, or maintain some horizontal spacing between two elements.
Rectangle {
    anchors.left: parent.left
    anchors.leftMargin: 10
}
  1. anchors.right- This property is used to align the right edge of an element with the left or right edge of another element such as a parent or sibling. For example, you can anchor the right edge of a button to the right edge of a parent element, or make two elements close together horizontally.
Rectangle {
    anchors.right: parent.right
    anchors.rightMargin: 10
}
  1. anchors.top- This property is used to align the top edge of an element with the top or bottom edge of another element, such as a parent or sibling. For example, you could anchor the top edge of a button to the top edge of a parent element, or maintain some vertical spacing between two elements.
Rectangle {
    anchors.top: parent.top
    anchors.topMargin: 10
}
  1. anchors.bottom- This property is used to align the bottom edge of an element with the top or bottom edge of another element, such as a parent or sibling. For example, you could anchor the bottom edge of a button to the bottom edge of a parent element, or make two elements close together vertically.
Rectangle {
    anchors.bottom: parent.bottom
    anchors.bottomMargin: 10
}

By combining these properties, you can control the horizontal and vertical positional relationship of elements to create dynamic and adaptive layouts. Also, you can use the additional anchors.leftMargin, anchors.rightMargin, anchors.topMargin, anchors.bottomMarginattributes to adjust the margin spacing between elements.

Use individual anchor properties to set layout relationships between elements

Layout relationships between elements can be flexibly set in QML using individual anchor properties ( anchors.left, anchors.right, anchors.top, ). anchors.bottomBelow is an example showing how to use these attributes to build an adaptive interface.

Suppose we want to create a layout with three rectangles: a left rectangle, a top rectangle, and a right rectangle. We'll use the anchor point property to make these rectangles close together, while having the left and top rectangles share one edge of each other.

import QtQuick 2.15

Rectangle {
    id: root
    width: 640
    height: 480
    color: "lightgray"

    Rectangle {
        id: leftRectangle
        width: 200
        height: 200
        color: "blue"

        anchors.left: parent.left
        anchors.leftMargin: 20
        anchors.top: parent.top
        anchors.topMargin: 20
    }

    Rectangle {
        id: topRectangle
        width: 200
        height: 200
        color: "green"

        anchors.left: leftRectangle.right
        anchors.leftMargin: 20
        anchors.top: parent.top
        anchors.topMargin: 20
    }

    Rectangle {
        id: rightRectangle
        width: 200
        height: 200
        color: "red"

        anchors.left: topRectangle.right
        anchors.leftMargin: 20
        anchors.top: parent.top
        anchors.topMargin: 20
    }
}

In this example, leftRectanglefirst rootalign the left and top edges of the to the left and top edges of the parent element ( ). Then topRectangle, leftRectanglealign the left edge of the to the right edge of the , and align the top edge topRectangleof to the top edge of the parent element. Finally rightRectangle, topRectanglealign the left edge of the to the right edge of the while aligning its top edge to the top edge of the parent element.

By setting these independent anchor properties, we successfully build an adaptive interface with a specific layout relationship. If desired, you can further fine-tune the layout, for example by adding spacing using anchors.*Marginthe property . Independent anchor properties help achieve precise layout control to meet UI design needs.

Center anchor: horizontal and vertical

In the QML anchor layout, in addition to the four basic anchor properties of left, right, top and bottom, there are two center anchor properties: anchors.horizontalCenterand anchors.verticalCenter. They are handy for centering one element horizontally or vertically relative to another element (usually the parent element).

  1. anchors.horizontalCenter

    This property aligns the horizontal center (horizontal midpoint) of an element with the horizontal center of another element. This ensures that the element stays centered horizontally. For example, to horizontally center a button on its parent element:

Rectangle {
    anchors.horizontalCenter: parent.horizontalCenter
}
  1. anchors.verticalCenter

    This property aligns the vertical center (vertical midpoint) of an element with the vertical center of another element. This ensures that the element stays vertically centered. For example, to vertically center a button on its parent element:

Rectangle {
    anchors.verticalCenter: parent.verticalCenter
}

You can also use anchors.horizontalCenterand anchors.verticalCenterto completely center an element on another element.

Rectangle {
    anchors.horizontalCenter: parent.horizontalCenter
    anchors.verticalCenter: parent.verticalCenter
}

The center anchor property simplifies the process of centering elements in UI layouts and ensures good responsiveness throughout. No matter how the size of the parent container changes, the child element will remain centered.

Learn more about anchors.fill

anchors.fill How to combine individual anchor properties

anchors.fillAn attribute is a shortcut in QML for matching the four edges (left, right, top, bottom) of an element to the corresponding edges of another element (usually the parent) at the same time. It actually combines four separate anchor properties ( anchors.left, anchors.right, anchors.top, anchors.bottom) and lets you set layout constraints on elements more concisely.

When you use anchors.fillthe attribute , it is actually equivalent to connecting each of the four anchor attributes of the element with the four edges of the referenced element. The following code shows how anchors.fillthe attribute corresponds to using the anchor attribute alone:

use anchors.fill:

Rectangle {
    anchors.fill: parent
}

Equivalent to using a separate anchor attribute:

Rectangle {
    anchors.left: parent.left
    anchors.right: parent.right
    anchors.top: parent.top
    anchors.bottom: parent.bottom
}

Use anchors.fillto easily implement layout constraints between elements and referenced elements without introducing extra code, especially when you want child elements to fill the entire parent container. This makes the UI layout more compact and manageable.

Relationship between anchors.fill and other anchor properties

anchors.fillAttributes serve as a simplification in QML anchor layout, associating the four edges (left, right, top, bottom) of an element with the corresponding edges of another element (such as a parent element). This property is actually a combination of four individual anchor properties ( anchors.left, anchors.right, anchors.top, anchors.bottom).

In most cases, anchors.fillit is used to fill the child element to the entire available space of the parent element (or reference element). anchors.fillWhen using , the four edges of the child element are automatically aligned with the four edges of the reference element. For example:

Rectangle {
    id: child
    anchors.fill: parent
}

In the above example, the child element childfills the entire parent element.

anchors.fillIn relation to other anchor properties, it is equivalent to setting those anchor properties all at once:

  • anchors.left: parent.left
  • anchors.right: parent.right
  • anchors.top: parent.top
  • anchors.bottom: parent.bottom

anchors.fillWhile the primary use of is to fill the entire space of the referenced element, it can also be used in conjunction with other anchor and margin properties ( anchors.leftMargin, anchors.rightMargin, anchors.topMargin, anchors.bottomMargin) for more precise layout needs. For example: If you want to adjust the margin between the child element and the parent element according to your needs, the margin property can meet this demand.

In summary, anchors.fillthe relationship between this property and other anchor properties is that it simplifies the process of setting up the layout of elements, allowing you to achieve the proper layout more quickly. However, you can still use other anchor properties individually if you need more fine-grained layout control.

Example of how anchors.fill works

Below is an example showing how to use anchors.fillthe attribute . This example creates a QML parent rectangle containing two child rectangles:

import QtQuick 2.15

Rectangle {
    id: root
    width: 400
    height: 400
    color: "lightgray"

    // 子矩形 1
    Rectangle {
        id: rectangle1
        color: "blue"

        // 使用 anchors.fill 属性将子矩形 1 填充至父元素的一半
        anchors.left: parent.left
        anchors.top: parent.top
        anchors.right: parent.horizontalCenter
        anchors.bottom: parent.bottom
    }

    // 子矩形 2
    Rectangle {
        id: rectangle2
        color: "red"

        // 使用 anchors.fill 属性将子矩形 2 填充至父元素的另一半
        anchors.left: parent.horizontalCenter
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.bottom: parent.bottom
    }
}

In this example, we use anchors.fillthe property and other independent anchor properties to fill the two sub-rectangles to the left and right half of the parent rectangle. The left, top, and bottom edges of child rectangle 1 are aligned with the corresponding edges of the parent rectangle, and the right edge is aligned with the horizontal center of the parent rectangle. Likewise, the top, right, and bottom edges of child rectangle 2 are aligned with the corresponding edges of the parent rectangle, and the left edge is aligned with the horizontal center of the parent rectangle.

This example shows how to flexibly implement adaptive layouts using anchors.filland other anchor properties. When the size of the parent rectangle changes, the child rectangle will automatically adjust to always fill the area of ​​the parent rectangle it is in.

Use Scenarios and Practical Applications

Scenarios for using anchors.fill when parent elements need to be filled

anchors.fillAttributes are handy when you need a child element to fill the entire available space of a parent element (or referenced element) . Here are some common anchors.fillusage scenarios:

  1. Background layer: In a UI, you may want a child element to act as a background, filling the entire parent container. In this case, use anchors.fillto have the background always fill the parent container and automatically adjust when the size changes.
Rectangle {
    id: root
    width: 600
    height: 400

    Rectangle {
        color: "lightblue"
        anchors.fill: parent  // 背景填充整个父容器
    }
}
  1. Child elements fill container: When using GridLayout, Columnor Rownested layouts, child elements may need to fill part of their parent container. For example, an adaptive button group where the buttons fill the entire height Rowof :
import QtQuick 2.15

Row {
    id: buttonRow
    width: 600
    height: 60
    spacing: 10

    Rectangle {
        color: "red"
        width: 100
        anchors.fill: parent  // 按钮填充 Row 的高度
    }

    Rectangle {
        color: "blue"
        width: 100
        anchors.fill: parent  // 按钮填充 Row 的高度
    }
}
  1. Image Scaling: Use to anchors.fillmake . Note that this situation may result in improperly scaled images. The image scale can be adjusted by setting the appropriate scaling mode.
Rectangle {
    id: root
    width: 800
    height: 600

    Image {
        source: "background.jpg"
        anchors.fill: parent  // 图像填充整个父容器
        fillMode: Image.PreserveAspectFit  // 保持图像宽高比
    }
}

In these scenarios, anchors.fillusing gives you a quick and clean way to lay out your layout and ensure that child elements fit within the available space of the parent container. At the same time, you can also use the margin property ( anchors.marginsor anchors.leftMargin, anchors.rightMargin, anchors.topMargin, anchors.bottomMargin) to adjust the spacing between elements according to your needs.

How to use anchors.fill in the application to handle windows of different sizes and resolutions

anchors.fillWhen using , the child elements will be automatically adjusted according to the window size. Here is an example anchors.fillof to show a simple application with an adaptive image background and centered text. Elements always fit perfectly in the window, no matter how the size and resolution of the window or screen changes.

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    id: mainWindow
    visible: true
    width: 800
    height: 600

    Image {
        id: backgroundImage
        source: "background.jpg"
        anchors.fill: parent  // 图像填充整个父窗口
        fillMode: Image.PreserveAspectCrop  // 保持宽高比并裁剪多余部分

        // 确保 image 被放置在文本和其他 UI 元素的下方
        z: -1
    }

    Text {
        id: centeredText
        text: "Welcome to our application!"
        font.pixelSize: 32
        color: "white"

        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
    }
}

In this example, we set the background image's anchor property to fill the entire window. By fillModesetting to Image.PreserveAspectCrop, the image will stretch with the window while maintaining the aspect ratio, and crop the excess. ApplicationWindowImages can be automatically adjusted for windows of different sizes and resolutions.

At the same time, we center a Textelement horizontally and vertically on the window. By using anchors.horizontalCenterand anchors.verticalCenter, the text is always kept in the center of the window.

In a real application, you can use more complex layouts and multiple levels of adaptive elements as needed. The key is to make full use of QML's anchor point and layout properties, set the appropriate component order and stacking order, so as to ensure that the application can still maintain good visual effects on screens of different sizes and resolutions.

Comparison with other layouts

other layout types

QML provides a variety of layout methods. Below we will briefly introduce some common layout types and compare them with anchor layouts using anchors.filland other anchor properties:

  1. Anchor layout:

    Use anchorsattributes (such as anchors.fill, anchors.left, anchors.horizontalCenteretc.) to achieve relative positioning between elements. It is flexible and intuitive, and can maintain good adaptability under different window sizes and screen resolutions. Anchor layout is suitable for a variety of complex scenarios, such as alignment, padding, and centering between elements.

  2. Positioning layout:

    Use xthe and yattributes to achieve absolute positioning of elements within the parent container. It's simple to use, but may not adapt well when windows are resized or resolutions change. Positioning layout is suitable for simple interface or interface components, where static size and layout requirements are not strict.

  3. Column layout (Column):

    Allows vertical stacking of child elements. It's great for ordered vertical lists or elements with fixed spacing and order. The disadvantage is that it is not easy to handle complex horizontal layout requirements. Can be combined with other layout methods to create more complex interfaces.

    Example:

    Column {
        anchors.fill: parent
        spacing: 10
    
        Text { text: "Item 1" }
        Text { text: "Item 2" }
        Text { text: "Item 3" }
    }
    
  4. Row layout (Row):

    Similar to column layout, but stacks child elements horizontally. Suitable for horizontal lists or elements with fixed spacing and order. Can be combined with other layout methods to create more complex interfaces.

    Example:

    Row {
        anchors.fill: parent
        spacing: 10
    
        Text { text: "Item 1" }
        Text { text: "Item 2" }
        Text { text: "Item 3" }
    }
    
  5. Grid layout (GridLayout):

    Lays out child elements in a two-dimensional grid of rows and columns. It is relatively complex but highly flexible and can easily handle the layout of multi-row and multi-column elements. It can also be used in combination with other layout methods to handle more complex interface requirements.

    Example:

    GridLayout {
        anchors.fill: parent
        columns: 3
        rows: 3
        rowSpacing: 5
        columnSpacing: 5
    
        // 在网格中添加子元素 Item { ... }
    }
    

Features and application methods of advanced layout types:

  1. Filling strategies for ColumnLayout and RowLayout:

    The following attributes can be used in ColumnLayoutand RowLayoutto determine the padding strategy:

    • Layout.fillWidthAnd Layout.fillHeight: They allow children to adaptively occupy the remaining space, thus elastic layout.
    • Layout.preferredWidthand Layout.preferredHeight: These set the preferred size of the child, which is taken into account when the parent layout is resized.

Note that these properties must be set inside the child.

  1. Row and column setup in GridLayout:

    GridLayoutIn , you can use the following attribute templates to allocate space for rows and columns:

    • Layout.row: Specifies the row where the subitem is located.
    • Layout.column: Specify the column where the subitem is located.
    • Layout.rowSpan: Specifies the number of rows that the child item spans in the grid.
    • Layout.columnSpan: Specifies the number of columns the child will span across in the grid.

Note that these properties must be set inside the child. Here's an example of adjusting children in a grid layout:

import QtQuick 2.15
import QtQuick.Layouts 1.15

Rectangle {
    id: root
    width: 600
    height: 600

    GridLayout {
        anchors.fill: parent
        columns: 3
        rows: 3
        rowSpacing: 5
        columnSpacing: 5

        Rectangle {
            color: "red"
            Layout.fillWidth: true
            Layout.fillHeight: true
            Layout.column: 0
            Layout.row: 0
            Layout.rowSpan: 2
        }

        Rectangle {
            color: "green"
            Layout.fillWidth: true
            Layout.fillHeight: true
            Layout.column: 2
            Layout.row: 0
        }
    }
}
  1. Set spacing and margins:

    In all advanced layouts ( ColumnLayout, RowLayoutand GridLayout), you can set spacing and margins with the following properties:

    • spacing: Set the spacing between subitems.
    • margins: Sets the margin around the parent element.

Example:

import QtQuick 2.15
import QtQuick.Layouts 1.15

Rectangle {
    id: root
    width: 600
    height: 600

    ColumnLayout {
        anchors.fill: parent
        spacing: 10
        margins: 20

        Rectangle {
            color: "red"
            Layout.fillWidth: true
            Layout.preferredHeight: 100
        }

        Rectangle {
            color: "green"
            Layout.fillWidth: true
            Layout.preferredHeight: 100
        }
    }
}

Now you've learned more about the advanced features of ColumnLayout, , andRowLayout . GridLayoutThrough these features, you can flexibly configure the layout requirements of different scenarios, and create a stable user interface for your application that adapts to various sizes and resolutions. These advanced layout types can also be combined with anchor-based layouts for more complex effects.

Summary: Compared with other layout methods, anchor layout is flexible and adaptive. It's great for complex UI scenarios, especially when combined with other layout methods. However, in specific scenarios, other layout methods (such as Column, Row, and GridLayout) may be more suitable for quickly achieving a neat element layout. You should choose the appropriate layout method according to the actual application requirements, and even combine multiple layouts to create a stable, adaptive and beautiful interface.

Comparing anchor layouts to other layout methods: advantages, disadvantages, and when to use them

Anchor layout has its own advantages and disadvantages compared to other layout methods. Depending on the usage scenario, you might choose a different layout method. Here, we compare anchor layouts with other layout types, analyzing their advantages, disadvantages, and applicability.

  1. Anchor layout:

    Advantage:

    • Relative layout is easy to understand and use.
    • It can easily handle scenes with window size changes and different resolutions, and has good adaptability.
    • Suitable for complex UI scenarios such as alignment, padding and centering between elements.
    • It can be used in combination with other layouts when needed to achieve rich layout effects.
      Disadvantages:
    • For ordered elements, the layout needs to be calculated manually.
    • Compared to other layout types, more style and layout calculations may be required to achieve the same effect.
      Applicable situation:
    • When you need to implement scalable UI and need to meet different window sizes and resolutions.
    • Specific control and flexible adjustment of the relative position of elements.
  2. Column layout (Column), row layout (Row) and other basic layouts:

    Advantage:

    • Easy to understand and apply to simple UI scenarios.
    • Can quickly achieve regular lists and ordered arrangements.
    • For simple interface elements, get started quickly.
      Disadvantages:
    • It is not flexible enough and needs to be used in combination with other layout types when dealing with complex UI scenarios.
    • For scenes where the window size changes and the resolution is different, the adaptability is weak.
      Applicable situation:
    • When it is necessary to achieve a simple and regular arrangement of elements, such as vertical lists, horizontal lists, button groups, etc.
    • The interface is simple, and the elements are arranged in a fixed interval and arranged in a straight line.
  3. Advanced layout types (ColumnLayout, RowLayout and GridLayout):

    Advantage:

    • Highly flexible and capable of handling complex UI scenarios.
    • It supports scenes with window size changing and different resolutions very well.
    • Can be used in nested layouts to achieve complex UI effects.
    • Can be used in conjunction with anchor layouts to extend layout functionality.
      Disadvantages:
    • Compared with the layout of the basic type, the learning cost and implementation difficulty are higher.
    • For simple regular layouts, using advanced layouts may appear redundant.
      Applicable situation:
    • Create responsive layouts with multiple rows or columns.
    • A complex UI that needs to accommodate changing window sizes and different resolutions.
    • Combine with other layout types for highly customized and complex interface designs.

According to your actual needs, you can choose the appropriate layout type. When dealing with complex UI scenarios, you may need the flexibility to combine multiple layout methods to achieve the best results. Typically, advanced layout types such as ColumnLayout, RowLayout, and GridLayout are used in conjunction with anchor layouts to meet various UI design needs.

When to use other layouts When to use anchors.fill and when to use other layouts

anchors.fillis the part of the anchor layout that makes one element completely fill another element. The following are recommended scenarios for using anchors.fillwith other layout methods:

anchors.fillScenarios to use :

  1. When you want one element to completely cover another element, such as automatically filling the entire area when a parent or other referenced element changes size.
  2. When used as background elements, such as background images or colors, you want them to occupy the entire view at all times.
  3. When a view or interface component needs to fill its container, it remains filled regardless of the size of the container.

Example:

Rectangle {
    id: outerRectangle
    width: 200
    height: 200

    Rectangle {
        id: innerRectangle
        anchors.fill: outerRectangle
        color: "blue"
    }
}

Scenarios using other layout methods:

  1. When you need to arrange multiple elements in an orderly manner in a container, such as list, grid, etc., you can consider using Column, Row or GridLayout.
  2. When you need to maintain a specific relative relationship between elements, such as alignment, distance, centering, etc., you can choose other anchor properties in the anchor layout, such as anchors.left, anchors.right, anchors.top, anchors.bottom, anchors.horizontalCenteror anchors.verticalCenter.
  3. When you need to create highly customized and complex layouts, you can choose advanced layout types such as ColumnLayout, RowLayout or GridLayout.

Depending on your scenario, you may need to use a combination of anchors.fillwith other layout methods to achieve the desired interface. It is best to understand the advantages and applicability of various layout types, and use them flexibly in combination according to actual needs.

Frequently Asked Questions and Considerations Resolving Conflicting Anchor Issues

Solve the problem of conflicting anchors

The conflicting anchors problem occurs when you try to layout with mutually exclusive anchors, such as setting left and right anchors and width at the same time will cause conflicts. To avoid these kinds of problems, you need to understand how anchors interact with each other, and use the right combination of anchors to avoid conflicts.

Here are some examples showing how to avoid conflicting anchor issues:

  1. Conflict: Use left and right anchors and width.

Error example:

Rectangle {
    id: rect
    anchors.left: parent.left
    anchors.right: parent.right
    width: 100 // 这里会导致冲突
}

Solution: only set the left and right anchor points, do not set the width (the width will be automatically calculated based on the left and right anchor points).

Correct example:

Rectangle {
    id: rect
    anchors.left: parent.left
    anchors.right: parent.right
}
  1. Conflict: Using top, bottom anchors and height.

Error example:

Rectangle {
    id: rect
    anchors.top: parent.top
    anchors.bottom: parent.bottom
    height: 100 // 这里会导致冲突
}

Solution: Only set the top and bottom anchors, not the height (the height will be calculated automatically based on the top and bottom anchors).

Correct example:

Rectangle {
    id: rect
    anchors.top: parent.top
    anchors.bottom: parent.bottom
}
  1. Conflicts: left anchor, horizontal center anchor and width.

Error example:

Rectangle {
    id: rect
    anchors.left: parent.left
    anchors.horizontalCenter: parent.horizontalCenter
    width: 100 // 这里会导致冲突
}

Solution: Choose an anchor, for example just use the left anchor and width.

Correct example:

Rectangle {
    id: rect
    anchors.left: parent.left
    width: 100
}

In conclusion, be careful not to introduce conflicting constraints when using anchor layout. A better understanding of how to set the exact anchor points will help avoid these kinds of problems, creating a conflict-free, clear layout structure.

anchors.fill 与元素 zIndex 属性的关系

anchors.fillzIndexAttributes and elements are two different concepts. anchors.fillUsed to make one element size and position match another. zIndexAttributes are used to control the position of an element in the stacking order, i.e. which element will cover another element.

Here we explain the relationship between the two:

  1. anchors.fillzIndexIndependent use of and :

anchors.fillUsed to set an element to follow another element in size and position. For example:

Rectangle {
    id: parentRectangle
    width: 200
    height: 200

    Rectangle {
        id: childRectangle
        anchors.fill: parentRectangle
        color: "blue"
    }
}

In this example, childRectanglethe size and position of is parentRectangleexactly the same as the , but is not set zIndex. By default, later elements are rendered on top of previous elements.

zIndexAttributes are used to define the order in which elements are stacked within their parent container. Elements with higher zIndexvalues ​​override elements with lower values. Example:

Rectangle {
    width: 200
    height: 200
    color: "red"

    Rectangle {
        id: blueRectangle
        x: 50
        y: 50
        width: 100
        height: 100
        color: "blue"
        zIndex: 1
    }

    Rectangle {
        id: greenRectangle
        x: 100
        y: 100
        width: 100
        height: 100
        color: "green"
    }
}

In this example, blueRectanglethe zIndexis 1, which is greater than greenRectanglethe default zIndex(0) of . So blueRectangleoverlays greenRectangleon .

  1. anchors.fillzIndexCombinations of and :

When combining anchors.filland zIndex, you can use anchors.fillto ensure that an element is sized and positioned to match another element, and then use zIndexto control their visual stacking order. Example:

Rectangle {
    id: parentRectangle
    width: 200
    height: 200
    color: "red"

    Rectangle {
        id: childRectangle1
        anchors.fill: parentRectangle
        color: "blue"
        opacity: 0.5
        zIndex: 1
    }

    Rectangle {
        id: childRectangle2
        anchors.fill: parentRectangle
        color: "green"
        opacity: 0.5
    }
}

In this example, and arechildRectangle1 filled . Since is 1 for is higher than the default (0) for , will override on .childRectangle2parentRectanglechildRectangle1zIndexchildRectangle2zIndexchildRectangle1childRectangle2

In conclusion, anchors.filland zIndexcan be used independently or in combination. anchors.fillcontrols the size and position of elements, while zIndexcontrols the visual stacking order of elements. There is no direct dependency between the two, but work together to achieve the desired layout and visual effects.

clipAttributes of parent and child elements and how they affect the visual display

clipAn attribute is an attribute defined in QML Itemtypes as well as many other element types (eg Rectangle, , etc.). ImageIt is used to control whether an element's drawing area is limited within its own bounds. When clipthe property is set trueto , the element is only drawn within its bounds, and any portion of child elements outside this bound will be clipped (not displayed).

Here is an explanation of the relationship between parent-child elements and clipattributes , and the effect on visual display:

  1. When the parent element's clipattribute is set to false(the default):

Parent and child elements can be displayed outside the bounds of the parent element. Child element parts can even be displayed completely outside of the parent element.

Example:

Rectangle {
    id: parentRectangle
    width: 200
    height: 200
    color: "red"

    Rectangle {
        id: childRectangle
        x: 150
        y: 150
        width: 100
        height: 100
        color: "blue"
    }
}

In this example, parentRectanglethe clipproperty defaults to false, so parts childRectangleof the can be parentRectangledisplayed outside the bounds of the .

  1. When the parent element's clipattribute is set to true:

The parent element will limit the drawing area of ​​the child element, and the part of the child element beyond the boundary of the parent element will not be displayed.

Example:

Rectangle {
    id: parentRectangle
    width: 200
    height: 200
    color: "red"
    clip: true // 将 clip 属性设置为 true

    Rectangle {
        id: childRectangle
        x: 150
        y: 150
        width: 100
        height: 100
        color: "blue"
    }
}

In this example, parentRectanglethe clipproperty is set to true, so the portion childRectangleof the ( parentRectanglearea beyond the bounds of the ) is clipped and not displayed.

In short, clipthe attributes affect their visual display. When clipthe property is set to true, the display of child elements will be constrained within the bounds of the parent element. This property is useful for controlling visual effects and limiting overflow of content.

Guess you like

Origin blog.csdn.net/qq_21438461/article/details/130570100