Итак, при тестировании своей программы я обнаружил очень странную вещь.
Итак, у меня есть элемент 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
}
Я не могу придумать что-нибудь, что могло бы вызвать такое поведение ... какие-нибудь идеи?