在打开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
组件visibleYear
和Calendar
提供的信息。
这些标签相应地填充到onVisibleYearChanged
的{{1}}和onVisibleMonthChanged
。
所选日期为2015/01/01。
好吧,回到2014年的一个月。
Calendar
在访问onVisibleYearChanged
的{{1}}和visibleMonth
属性时看起来是正确的,而visibleYear
看起来像生活在Calendar
遥远的未来。
现在,试着继续迈向2015年。
同样,虽然onVisibleMonthChanged
的行为方式仍然正确,但onVisibleYearChanged
正在访问过去的onVisibleMonthChanged
组件。
你可以在新的一年里来回走动,对信号Calendar
作出反应的函数永远不会正常运行,因为一旦所有内部属性都没有正确设置,它就会调用。
那就是说,我做错了,因此问题在我的代码中(当然,上面的一个是一个更复杂的项目的小例子)或者我真的在'Calendar`组件中发现了一个错误我应该开一张Qt项目的门票吗?
答案 0 :(得分:1)
即使我要求修改组件看起来有点奇怪,但是通知它已更新,因此发现我的更改只是部分设置(一种正在进行的工作通知),就是这样。
似乎错误符合我的期望。 : - )
month
移动或移回year
(即12月到1月,反之亦然)后,Calendar
组件会正确更新property visibleMonth
和property visibleYear
。
无论如何,一旦内部表示作为一个整体更新,不能保证发出相应的信号(onVisibleMonthChanged
和onVisibleYearChanged
)。
实际上,当对第二个属性的更改仍处于未决状态时会发出前者,因此查询侦听器中的visibleYear
属性以错误的年结束(或者至少是一个尚未更新的。)
作为解决方案的一个例子,组件的用户可以通过在两个信号上附加一个监听器来解决这种奇怪的行为,即使我强烈怀疑那里有一个更好的解决方案等着我。
我会设法找到另一种方法。 感谢您的所有回复。