2015-10-10 2 views
1

Прежде чем открывать ошибку в проекте Qt, я хотел бы спросить вас, что я делаю что-то неправильно или Qml Calendar действительно сходит с ума.Компонент Qml Calendar сходит с ума?

Отсюда следует код, который может быть использован, чтобы проверить его:

import QtQuick 2.5 
import QtQuick.Window 2.0 
import QtQuick.Controls 1.4 
import QtQuick.Controls.Styles 1.4 
import QtQuick.Layouts 1.1 

Window { 
    visible: true 
    width: 1024 
    height: 768 

    ColumnLayout { 
     anchors.fill: parent 
     anchors.margins: 8 

     Calendar { 
      id: calendar 
      Layout.fillWidth: true 
      Layout.fillHeight: true 
      weekNumbersVisible: true 
      selectedDate: new Date("2015/01/01") 
      frameVisible: true 
      focus: true 

      onVisibleMonthChanged: visibleMonthChangedRef.currDate = visibleYear+"/"+visibleMonth 
      onVisibleYearChanged: visibleYearChangedRef.currDate = visibleYear+"/"+visibleMonth 
     } 

     Label { 
      id: visibleMonthChangedRef 
      Layout.fillWidth: true 
      property string currDate: "" 
      text: "onVisibleMonthChanged -> " + currDate 
      Component.onCompleted: font.pointSize = font.pointSize*2 
     } 

     Label { 
      id: visibleYearChangedRef 
      Layout.fillWidth: true 
      property string currDate: "" 
      text: "onVisibleYearChanged -> " + currDate 
      Component.onCompleted: font.pointSize = font.pointSize*2 
     } 
    } 
} 

Спокойный, запустить приложение и вы увидите календарь, а также несколько ярлыков, которые сообщают информацию о и visibleYear, как это предусмотрено компонентом Calendar. Эти этикетки заполняются соответственно onVisibleYearChanged и onVisibleMonthChanged от Calendar. Выбранная дата 2015/01/01.

Ну, вернуться в месяц к 2014 г.

onVisibleYearChanged выглядит быть правильным при обращении к и visibleYear свойства Calendar, в то время как onVisibleMonthChanged смотрит на меня, как жить в далеком будущем.

Теперь попробуйте перейти в месяц к 2015 году

Опять же, в то время как onVisibleYearChanged все еще ведет себя правильный путь, то onVisibleMonthChanged обращается к Calendar компонент, который сидит в прошлом.

Вы можете вернуться назад и вперед в течение нового года, и функция, реагирующая на сигнал onVisibleMonthChanged, никогда не будет вести себя правильно, поскольку она выглядит так, как вызывается, когда все внутренние свойства еще не установлены должным образом.

Это говорит о том, что я делаю что-то неправильно и, следовательно, проблема в моем коде (конечно, вышеприведенный пример является небольшим примером из более сложного проекта), или я действительно нашел ошибку в «Календаре» и я должен продолжить открытие билета в проект Qt?

ответ

1

Несмотря на то, что мне немного странно просить изменить компонент, будучи уведомленным о том, что он обновлен, таким образом обнаруживается, что мои изменения были только частично установлены (какое-то уведомление о ходе работы), вот и все.

Кажется, что ошибка была в моих ожиданиях. :-)

После того, как month перемещается на или назад по year (то есть, с декабря по январь, и наоборот), то Calendar компонент правильно обновляет property visibleMonth и property visibleYear.

В любом случае, нет гарантий, что соответствующие сигналы (onVisibleMonthChanged и onVisibleYearChanged) испускаются после того, как внутреннее представление обновлено в целом.

На самом деле, бывшая испускаются, когда изменения второго свойства еще не завершены, тем самым запрашивая visibleYear свойства в качестве слушателя заканчивается неправильного года (или по крайней мере, один еще не обновлен).

В качестве примера решения пользователь компонента может обойти это странное поведение, присоединив слушателя к обоим сигналам, хотя я сильно подозреваю, что там лучшее решение ждет меня.

Мне удастся найти альтернативный подход. Спасибо за все ваши ответы.

Смежные вопросы