2017-08-23 82 views
0

名單是否有一種方式來獲得的可見天列表當月視圖(包括以前/下個月也是可見的那些)QML日曆:可見天

+0

你想要什麼格式? – derM

+0

或簡寫爲:答案是**是** :-D – derM

回答

0

如果有人感興趣,我發現了一個更快捷的解決方法。以下代碼考慮從週一或週日開始的一週。

我檢查一個月的第一天是什麼日子,並得到第一週的週一/週日,然後我通過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) 
    } 
} 
2

如果我們檢查的代碼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