Qml日历组件变得疯狂吗?

时间:2015-10-10 09:08:07

标签: calendar qml

在打开Qt项目的错误之前,我想问你我做错了什么,或者Qml日历真的疯了。

它遵循可用于测试它的代码:

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
        }
    }
}

轻松上手,启动应用程序,您会看到一个日历以及一些标签,这些标签会报告visibleMonth组件visibleYearCalendar提供的信息。 这些标签相应地填充到onVisibleYearChanged的{​​{1}}和onVisibleMonthChanged。 所选日期为2015/01/01。

好吧,回到2014年的一个月。

Calendar在访问onVisibleYearChanged的{​​{1}}和visibleMonth属性时看起来是正确的,而visibleYear看起来像生活在Calendar遥远的未来。

现在,试着继续迈向2015年。

同样,虽然onVisibleMonthChanged的行为方式仍然正确,但onVisibleYearChanged正在访问过去的onVisibleMonthChanged组件。

你可以在新的一年里来回走动,对信号Calendar作出反应的函数永远不会正常运行,因为一旦所有内部属性都没有正确设置,它就会调用。

那就是说,我做错了,因此问题在我的代码中(当然,上面的一个是一个更复杂的项目的小例子)或者我真的在'Calendar`组件中发现了一个错误我应该开一张Qt项目的门票吗?

1 个答案:

答案 0 :(得分:1)

即使我要求修改组件看起来有点奇怪,但是通知它已更新,因此发现我的更改只是部分设置(一种正在进行的工作通知),就是这样。

似乎错误符合我的期望。 : - )

month移动或移回year(即12月到1月,反之亦然)后,Calendar组件会正确更新property visibleMonthproperty visibleYear

无论如何,一旦内部表示作为一个整体更新,不能保证发出相应的信号(onVisibleMonthChangedonVisibleYearChanged)。

实际上,当对第二个属性的更改仍处于未决状态时会发出前者,因此查询侦听器中的visibleYear属性以错误的年结束(或者至少是一个尚未更新的。)

作为解决方案的一个例子,组件的用户可以通过在两个信号上附加一个监听器来解决这种奇怪的行为,即使我强烈怀疑那里有一个更好的解决方案等着我。

我会设法找到另一种方法。 感谢您的所有回复。