组织孩子的 Qt Quick2 自定义控件

Posted

技术标签:

【中文标题】组织孩子的 Qt Quick2 自定义控件【英文标题】:Qt Quick2 Custom Controls that Organize Their Children 【发布时间】:2020-09-10 20:50:01 【问题描述】:

我想实现一个自定义的 Qt5 Quick 2 QML 自定义控件,它将一组任意和不同的按钮组合成一行,没有间距,给它一个边距,然后在它们周围画一个小边框(稍后,也许阴影或其他效果)。

我希望使使用变得非常简单,而不是需要大量的支持结构,但我现在不知道如何正确定义控件而不是包含其他控件并组织它们。

我可以创建一个自定义矩形,然后将 RowLayout 锚定到其内部,

BubbleButtonBar

    RowLayout
    
       Button
       
           text:"First"
       
       Button
       
           text:"Second"
       
       Button
       
           text:"Third"
       
    

但我希望让它更自动化,看起来像这样:

ButtonBar

   Button
   
       text:"First"
   
   Button
   
       text:"Second"
   
   Button
   
       text:"Third"
   

但是,我不知道如何让 ButtonBar.qml 文件将其子控件插入给定位置:

import QtQuick 2.0
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15

Item 
    
    property int pad: 50
    property int borderSize: 2
    width:mainRow.width + pad
    height: mainRow.height + pad

    Rectangle
    
        x: pad/2 - borderSize
        y: pad/2 - borderSize
        width:mainRow.width + borderSize*2
        height: mainRow.height + borderSize*2

        border.width: borderSize
        border.color: "red"

        RowLayout
        
            id: mainRow
            spacing: 0
            x: borderSize
            y: borderSize
            // <------- How to get child controls to insert here?           
        
    

似乎自定义container control 可能允许我定义contentItem,但目前尚不清楚这是如何完成的。或者,如果这是确保子控件进入父自定义控件布局的最合适方式。

这可能吗?

【问题讨论】:

【参考方案1】:

您只需要使用default property

// ButtonBar.qml
Item 
    default property alias contents: mainRow.data

    RowLayout 
        id: mainRow
    

然后 ButtonBar 的任何子级都将插入到mainRow

【讨论】:

以上是关于组织孩子的 Qt Quick2 自定义控件的主要内容,如果未能解决你的问题,请参考以下文章

Qt编写自定义控件41-自定义环形图

qt 自定义控件怎么使用? 用“Qt4设计师自定义控件”写了个控件,但是不知道怎么使用,急啊!

Qt:自定义 QListView 和实时控件

qt自定义控件样式在提升使用中不生效之坑

Qt自定义控件

Qt自定义控件之日志控件