Qml 单击按钮更改日历样式

Qml 单击按钮更改日历样式,qml,qt5,qtquick2,qtquickcontrols,Qml,Qt5,Qtquick2,Qtquickcontrols,单击按钮时,我需要更改日历样式。目前,在下面的代码中,样式更改仅在第一次创建对象时有效,但只要单击按钮,我就需要手动更改样式 以下是QML代码: import QtQuick 2.0 import QtQuick 2.2 import QtQuick.Controls 1.2 import QtQuick.Controls.Private 1.0 import QtQuick.Controls.Styles 1.1 ApplicationWindow { visible: true

单击
按钮时,我需要更改
日历
样式
。目前,在下面的代码中,
样式
更改仅在第一次创建对象时有效,但只要单击
按钮
,我就需要手动更改样式

以下是QML代码:

import QtQuick 2.0
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Private 1.0
import QtQuick.Controls.Styles 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 400
    minimumWidth: 400
    minimumHeight: 300
    color: "#f4f4f4"
    id: root

    Calendar {
        id: cal_panel
        anchors.topMargin: 10
        anchors.horizontalCenter:  parent.horizontalCenter;
        frameVisible:false

        style: CalendarStyle {
            gridVisible: false
            dayDelegate: Rectangle {

                color: styleData.selected ? "#FF2E7BD2" : (styleData.visibleMonth && styleData.valid ? "#191919" : "#191919");

                Text {
                    id:day_txt
                    text: styleData.date.getDate()
                    font.bold: true
                    anchors.centerIn: parent
                    color: {
                        var color = "#dddddd";
                        if (styleData.valid) {
                            color = styleData.visibleMonth ?  "#bbb" : "#444";

                            var sel = root.getHiglightDates();
                            for(var i=0;i<sel.length;i++){
                                if(sel[i]===Qt.formatDateTime(styleData.date,"dd:MM:yyyy"))
                                    color="red"
                            }

                            if (styleData.selected) {
                                color = "black";
                            }
                        }
                        color;
                    }
                }
            }
        }
    }

    Button{
        anchors.top:cal_panel.bottom
        anchors.topMargin: 10
        anchors.horizontalCenter: parent.horizontalCenter
        text:"Higlight"
        onClicked: {
            console.log("Higlight here....")
        }
    }  

    function getHighlightDates(){
        var sel = ["10:11:2015","12:11:2015","11:11:2015","08:11:2015","09:11:2015"];
        return sel;
    }   
}
导入QtQuick 2.0
导入QtQuick 2.2
导入QtQuick.Controls 1.2
导入QtQuick.Controls.Private 1.0
导入QtQuick.Controls.Styles 1.1
应用程序窗口{
可见:正确
宽度:640
身高:400
最小宽度:400
最低高度:300
颜色:“F4”
id:根
历法{
id:cal_面板
上边距:10
anchors.horizontalCenter:parent.horizontalCenter;
frameVisible:false
样式:日历样式{
gridVisible:错误
dayDelegate:矩形{
颜色:styleData.selected?”#FF2E7BD2::(styleData.visibleMonth&&styleData.valid?”#191919:“#191919”);
正文{
id:day_txt
text:styleData.date.getDate()
font.bold:正确
anchors.centerIn:父对象
颜色:{
var color=“#dddddd”;
if(styleData.valid){
color=styleData.visibleMonth?#bbb:“#444”;
var sel=root.getHiglightDates();

对于@skypjack已经建议的(var i=0;i,您只需单击即可指定一种新样式。
style
属性是一个
组件
,因此这样做没有问题:

组件{
id:style1
日历样式{
背景:矩形{颜色:“浅黄色”}
}
}
组成部分{
id:style2
日历样式{
背景:矩形{颜色:“橙色”}
}
}
历法{
id:日历
锚定。填充:父级
样式:样式1
再次点击:{
calendar.style=style2;
}
}

正如@skypjack已经建议的那样,您只需单击即可指定新样式。
样式
属性是一个
组件
,因此这样做没有问题:

组件{
id:style1
日历样式{
背景:矩形{颜色:“浅黄色”}
}
}
组成部分{
id:style2
日历样式{
背景:矩形{颜色:“橙色”}
}
}
历法{
id:日历
锚定。填充:父级
样式:样式1
再次点击:{
calendar.style=style2;
}
}

根据问题和@folibis答案中的评论,问题似乎只是围绕着如何在用户通过单击按钮更新列表后,让日历样式反映所选日期的更新列表(来自
getHiglightDates()

只需添加一个新属性
selectedDates
来存储所选日期(以前保存在
getHighlightDates()
中)如何与下面的代码类似。通过使用属性绑定,只要
selectedDates
发生更改,所选日期的外观将自动更新。在下面的代码中,“day_txt”
文本的颜色将在
selectedData
更新时更新(当
selectedDates
更新时,该属性也随之更新)


根据问题和@folibis答案中的评论,问题似乎只是围绕着如何让日历样式反映用户通过单击按钮更新列表后所选日期的更新列表(从
getHiglightDates()

只需添加一个新属性
selectedDates
来存储所选日期(以前保存在
getHighlightDates()
中)如何与下面的代码类似。通过使用属性绑定,只要
selectedDates
发生更改,所选日期的外观将自动更新。在下面的代码中,“day_txt”
文本的颜色将在
selectedData
更新时更新(当
selectedDates
更新时,该属性也随之更新)


作为一个简单的解决方案,您可以在
单击事件上重新指定样式,强制对
日历
项进行后台刷新

要做到这一点,您可以使用

cal_panel.style=cal_panel.style

请注意,此解决方案并非完全对性能友好。:-

作为一个简单的解决方案,您可以在
单击事件时重新指定样式,强制对
日历项目进行后台刷新

要做到这一点,您可以使用

cal_panel.style=cal_panel.style

请注意,此解决方案并非完全对性能友好。:-

是的,我知道此方法,但在我的情况下,每次单击按钮时,我都必须突出显示由
getHiglightDates()返回的不同日期
函数。因此,我的问题是如何根据
getHiglightDates()
@folibis返回的日期列表更改
dayDelegate
的文本颜色。问题不清楚,我误解了,您的回答确实是错误的,或者更好,它没有回答正确的问题。:-)是的,我知道这种方法,但在我的情况下,每次单击按钮时,我都必须突出显示由
getHiglightDates()
函数返回的不同日期。因此,我的问题是如何根据
getHiglightDates()返回的日期列表更改
daydegate
的文本颜色
@folibis问题不清楚,我误解了,你的回答确实是错误的,或者更好,它没有回答正确的问题。:-)