Перебирать кнопки в ButtonGroup QML - PullRequest
0 голосов
/ 09 мая 2018

У меня есть связка на Button в моем QML приложении. Поскольку на одной странице много кнопок, пользователю может быть трудно увидеть, какая кнопка была нажата последней! Поэтому я хотел бы изменить последний шрифт кнопки, чтобы указать, что он был нажат, но позже, когда нажата другая кнопка, я бы хотел восстановить ее шрифт снова.

Я не могу найти хороший способ сделать это. Я попытался подключить все кнопки к ButtonGroup, но мне нужно перебрать все кнопки, чтобы получить set underline to false, но, тем не менее, я пытаюсь сделать это, я получаю другой тип ошибки.

См. Пример ниже:

Button {
    text: qsTr("Open")
    ButtonGroup.group: buttonGroup
    font.pointSize: 20; font.family: "Courier"
    onPressed:  { /* some action here*/ }
    onReleased: { /* some action here*/ }
}

Button {
    text: qsTr("Close")
    ButtonGroup.group: buttonGroup
    font.pointSize: 20; font.family: "Courier"
    onPressed:  { /* some action here*/ }
    onReleased: { /* some action here*/ }
}


ButtonGroup {
    id: buttonGroup

    function underlineButtons(underlined) {
        for (var i = 0; i < buttons.length; ++i) {
            children[i].font.underline = underlined;
        }
    }

    onClicked: {
        console.log(" -------------- buttonGroup Clicked: ", button.text)
        underlineButtons(false)         // restore old buttons
        button.font.underline = true    // mark the last button clicked
    }
}

Я получаю следующую ошибку, что когда-либо делаю, пытаясь получить доступ к элементу children.

qrc:/main.qml:65 ((null)): qrc:/main.qml:65: ReferenceError: children is not defined

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы также можете попробовать использовать свойство activeFocus, а затем в шрифте вы можете запросить, находится ли кнопка в активном фокусе.

Button {
    text: qsTr("Open")
    font.pointSize: activeFocus ? 30 : 20
    font.family: "Courier"
    onPressed: {
        activeFocus = true
        /* some action here*/ }
    onReleased: {/* some action here*/ }
}

Button {
    text: qsTr("Close")
    font.pointSize: activeFocus ? 30 : 20
    font.family: "Courier"
    onPressed: {
        activeFocus = true
        /* some action here*/ }
    onReleased: {/* some action here*/ }
}
0 голосов
/ 09 мая 2018

Краткий ответ

Вы можете либо

  • итерация на children родителя ваших кнопок
  • или итерируйте buttons вашего ButtonGroup.

Длинный ответ

Каждый QML-элемент имеет свойство children, содержащее все наследуемые Item-элементы. Это означает, что вы можете перебирать дочерние элементы элемента, как и любой другой список элементов.

Item {
    id: container

    function setUnderlineOnChildren() {
        for (var i = 0; i < children.length; ++i) {
            children[i].font.underline = true; 
        }
    }

    Button {}
    Button {}
    Button {
        onClicked: {
            container.setUnderlineOnChildren();
        }
    }
}

ButtonGroup используется для создания взаимоисключающих проверяемых кнопок (например, переключателей), как описано в документации . Но в отличие от большинства элементов QML, поскольку он не представляет графический элемент, он наследует QtObject вместо Item. Так что у него не будет свойства children Items. Но вы должны быть в состоянии сделать то же самое, полагаясь на свойство buttons, добавив к вышеуказанному

ButtonGroup {
    id: myGroup
    buttons: container.children

    function underlineButtons(underlined) {
        for (var i = 0; i < buttons.length; ++i) {
            buttons[i].font.underline = underlined; 
        }
    }
}

А потом звонить myGroup.underlineButtons(true).

...