QML日历:可见天

问题描述:

名单是否有一种方式来获得的可见天列表当月视图(包括以前/下个月也是可见的那些)QML日历:可见天

+0

你想要什么格式? – derM

+0

或简写为:答案是**是** :-D – derM

如果有人感兴趣,我发现了一个更快捷的解决方法。以下代码考虑从周一或周日开始的一周。

我检查一个月的第一天是什么日子,并得到第一周的周一/周日,然后我通过day = firstDay + X检查X goes from 0 to 42

function checkMonthlyCases(currentYear, currentMonth){ 
    var firstMonthDay = new Date(currentYear,currentMonth,1,0) 
    var firstVisibleDay = new Date(firstMonthDay.getTime() - (((firstMonthDay.getDay() === Locale.Sunday) ? Qt.Sunday : firstMonthDay.getDay()) - 1) * 86400000) 

    if(startDay == Qt.Sunday){ 
     firstVisibleDay = new Date(firstVisibleDay.getTime() - 86400000); 
    } 

    for(var i=0; i< 42; i++){ // 42: number of visible days 
     var checkDay = new Date(firstVisibleDay.getTime() + i*86400000) 
     var count = getDayCaseCount(checkDay) 
    } 
} 

如果我们检查的代码Calendarhere我们可以找到一个可疑的财产__model。我们发现,它始终是42的count - 这是可见的天数。

的问题是,在QML,我们真的不能访问的QAbstractItemModel的后裔,因为我们需要一个QModelIndex来获取数据,与int,而不是roleNames斗争,以确定角色e.t.c.
所以我们需要引入一个小帮手,它提供get(index)函数给我们,从ListModel已知。作为基础,我们可以使用QIdentityProxyModel,我们将通过缺少的暴露方法来扩展。

qmlproxymodel.h

#ifndef QMLPROXYMODEL_H 
#define QMLPROXYMODEL_H 

#include <QObject> 
#include <QIdentityProxyModel> 
#include <QMap> 

class QMLProxyModel : public QIdentityProxyModel 
{ 
    Q_OBJECT 
public: 
    QMLProxyModel(QObject* parent = nullptr); 

public slots: 
    QMap<QString, QVariant> get(int row_index) const; 
}; 

#endif // QMLPROXYMODEL_H 

qmlproxymodel.cpp

#include "qmlproxymodel.h" 

QMLProxyModel::QMLProxyModel(QObject* parent) 
    : QIdentityProxyModel(parent) 
{ 

} 

QMap<QString, QVariant> QMLProxyModel::get(int row_index) const 
{ 
    QMap<QString, QVariant> ret; 
    QModelIndex ind = index(row_index, 0); 
    QHash<int, QByteArray> roles = roleNames(); 

    // for some reason the itemData-method always throw a index-out-of-range exception 
    for (int e : roles.keys()) { 
     ret.insert(roles.value(e), data(ind, e)); 
    } 

    return ret; 
} 

然后我们在main.cpp中注册这个新类型QML

qmlRegisterType<QMLProxyModel>("QMLProxyModel", 1, 0, "QMLProxyModel"); 

最后,我们用它在QML:

Calendar { 
    id: cal 
    anchors.fill: parent 
} 

QMLProxyModel { 
    id: pm 
    sourceModel: cal.__model 
    onDataChanged: console.log("Some Data has changed", pm.get(0).date) 
} 

在这里,我只要输出的模式变化的数据首先显示日期的日期 - 也就是说,当选择了下个月。
对于您而言,编写一个JS函数来遍历QMLProxyModel的所有(42)元素以将内容添加到您所需的任何数据结构应该很容易。

+0

太棒了!谢谢!!! – laurapons