QML ListView затемняет или удаляет текст элемента, когда выбран соседний элемент

Итак, при тестировании своей программы я обнаружил очень странную вещь.

Итак, у меня есть элемент ListView с настраиваемой моделью C ++ и довольно простой делегат. Каждый делегат - это класс MyButton, который представляет собой просто класс Text (z: 2), класс Image (z: 1) и класс MouseArea. Этот класс Image является фоном и содержит полупрозрачное изображение, которое становится непрозрачным, когда MouseArea находится в onPressed ().

Теперь самое странное.

Когда ListView имеет 4 элемента, он работает нормально, за исключением случаев, когда пользователь выбирает запись №3, затем запись №2 или №1.

  • Когда выбранная запись идет от # 3 до # 1, текст в записи # 2 становится серым, а не обычным белым.
  • Когда выбранная запись идет от # 3 до # 2, текст в записи # 2 полностью исчезает.

После нескольких часов тестирования и ударов головой о стол я обнаружил еще кое-что:

  • Прозрачность MyButton или любого из его дочерних элементов никогда не меняется.
  • Цвет текстового элемента MyButton никогда не меняется
  • Содержимое тестового элемента MyButton никогда не меняется
  • После частичного смещения текста за пределы MyButton это ненормальное поведение влияет только на текст, остающийся внутри границ дочернего элемента Image MyButton.
  • Уровень Z MyButton или любого из его дочерних элементов никогда не изменяется, хотя создается впечатление, что изображение MyButton помещается поверх его текста.
  • Другое изображение никогда не помещается поверх элемента MyButton. Если бы это было так, то при переходе от №3 к №1 вы бы увидели, что изображение записи №2 становится темнее.
  • Когда ListView прокручивается, все возвращается в нормальное состояние.

Когда ListView содержит 4 элемента, ниже приведены отклонения от нормы:

  • когда # 4 -> # 1: # 2 и # 3 неактивны
  • когда # 4 -> # 2: # 2 исчезает
  • когда # 4 -> # 3: # 3 исчезает
  • когда # 3 -> # 2: # 2 исчезает
  • когда # 3 -> # 1: # 2 становится серым

Это согласуется с изменением порядка изображения и текста внутри класса MyButton, при котором изображение помещается на уровень Z над текстом. Однако уровни z принудительно указаны в определении MyButton, и сигнал onZChanged никогда не создается, когда происходят эти события.

Ниже приведен соответствующий код:

//MyButton:
import QtQuick 2.0

Item {
    id: button
    property string source: ""
    property string source_toggled: source
    property string button_text_alias: ""
    signal pressed
    width: button_image.sourceSize.width
    height: button_image.sourceSize.height
    property bool toggled: false

    Image{
        id: button_image
        z: 1
        source: toggled ? parent.source_toggled : parent.source

    }
    MyText{
        z: 2
        text_alias: button_text_alias
        anchors.centerIn: parent
    }

    MouseArea {
        id: button_mouse
        anchors.fill: parent
        onPressed: button.pressed()
    }
}


//ListView:
Component{
    id: p_button
    MyButton{
        source: picture_path + "bar.png"
        source_toggled: picture_path + "bar_selected.png"
        toggled: model.isCurrent
        onClicked: {
            profile_model.setCurrent(model.index)
        }
        button_text_alias: model.display
    }
}
ListView{
    id: p_list
    width: 623
    height: count*74 -1
    spacing: 1
    interactive: false
    model: p_model
    delegate: p_button
}

Я не могу придумать что-нибудь, что могло бы вызвать такое поведение ... какие-нибудь идеи?


person Paul Killam    schedule 21.04.2017    source источник


Ответы (1)


Я смог решить эту ошибку, разбив своего делегата на:

Component{
    id: p_button
    Item{
        property bool toggled: model.isCurrent
        width: button_image.sourceSize.width
        height: button_image.sourceSize.height
        Image{
            id: button_image
            visible: !toggled
            source: picture_path + "bar.png"
        }
        Image{
            visible: toggled
            source: picture_path + "bar_selected.png"
        }
        MouseArea{
            anchors.fill: parent
            onClicked: p_model.setCurrent(model.index)
        }
        MyText{
            text_alias: model.display
            anchors.centerIn: parent
        }
    }
}

Таким образом, вместо замены источника объекта два объекта становятся видимыми / невидимыми на основе логического значения. Это предотвратило проблему, хотя я до сих пор не знаю причины.

person Paul Killam    schedule 25.04.2017