QT日历控件重写美化

效果图

先放一个效果图以供大家参考,大家可以根据自己需要的效果来调整自己的控件,日历控件实现了自定义日历选择框,设置了表头颜色,设置日历当天重要事件提醒功能。

设置表头样式

cpp 复制代码
    setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);//去掉水平表头
    setLocale(QLocale(QLocale::Chinese));
    setHorizontalHeaderFormat(QCalendarWidget::SingleLetterDayNames); //单字母
    setFirstDayOfWeek(Qt::Monday);

    QTextCharFormat format;
    format.setForeground(QColor(0, 211, 255));
//    format.setForeground(QColor(255, 255, 255));
    format.setBackground(QColor(7, 34, 64));

    setHeaderTextFormat(format);
    setWeekdayTextFormat(Qt::Saturday, format);
    setWeekdayTextFormat(Qt::Sunday, format);
    UpdateCldColor(yearShown(),monthShown());

设置周六周日表头颜色

cpp 复制代码
void MyCalendar::UpdateCldColor(int y, int m)
{
    QTextCharFormat dateFormat;
    dateFormat.setForeground(QBrush(Qt::white));
    int d = 1;
    QDate curdate = QDate(y, m, d);


    int curday = curdate.dayOfWeek();
    int curmonth = curdate.month();

    // 找到第一个星期六
    while (curdate.isValid() && curday != 6)
    {
        if (curday == 7)
        {
            setDateTextFormat(curdate, dateFormat);
        }
        curdate = curdate.addDays(1);
        curday = curdate.dayOfWeek();
    }
    // 给每个周末设颜色

    while (curdate.isValid() && curmonth == m)
    {

        for (int i = 0; i < 2; i++)
        {
            if (curmonth != m) break;
            setDateTextFormat(curdate, dateFormat);
            curdate = curdate.addDays(1);
            curday = curdate.dayOfWeek();
            curmonth = curdate.month();
        }
        curdate = curdate.addDays(5);
        curday = curdate.dayOfWeek();
        curmonth = curdate.month();
    }

}

设置状态

cpp 复制代码
void MyCalendar::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{

    QCalendarWidget::paintCell(painter,rect,date);


    painter->save();
    QPixmap num_map;
    num_map.load(":/images/calendar_num.png");
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    QRect temp_rect;
    temp_rect = rect;
    temp_rect.setWidth(temp_rect.width()-8 );
    temp_rect.setHeight(temp_rect.height()-10);
#else
    QRect temp_rect;
    QMargins mar(4,5,4,5);
    temp_rect = rect.marginsAdded(mar);
#endif

    num_map.scaled(temp_rect.size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
    painter->drawPixmap(temp_rect,num_map);
    painter->restore();


    if(date == selectedDate())
    {
        painter->save();

#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    QRect temp_rect;
    temp_rect = rect;
    temp_rect.setWidth(temp_rect.width()-8 );
    temp_rect.setHeight(temp_rect.height()-10);
#else
    QRect temp_rect;
    QMargins mar(-4,-5,-4,-5);
    temp_rect = rect.marginsAdded(mar);
#endif
        QPixmap temp = m_backgroundPixMap.scaled(temp_rect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); // 缩放图片以适应单元格大小
        painter->drawPixmap(temp_rect,temp);
        painter->restore();
    }


#if 1
    QBrush brush;
    brush.setStyle(Qt::SolidPattern);
    brush.setColor(Qt::red);

    int d = 1;
    QDate startTime =  QDate(yearShown(), monthShown(),d);
    QDate endTime =  startTime.addMonths(1).addDays(-1);

    if(startTime <= date && date  <=  endTime  )
    {
        painter->save();
        QString datestr;
        datestr= date.toString("yyyyMMdd");
        QString temp_file;
        foreach (QFileInfo fileinfo, m_infolist)
        {
            temp_file = fileinfo.absoluteFilePath();
            if(temp_file.contains(datestr))
            {
                brush.setColor(Qt::green);
            }
            else
            {
            }
            // 绘制标记
            painter->setBrush(brush); // 设置标记的颜色
            QPoint point(rect.topRight().x() - 15, rect.topRight().y() + 13);
            painter->drawEllipse(point, 3, 3); // 绘制一个小圆点作为标记
        }
#if 0
        for(int i=0;i<m_contents.size();i++)
        {

            QString file_name = m_contents[i].file_name;

            if(file_name.contains(datestr))
            {
                brush.setColor(Qt::green);
            }
            else
            {
            }
            // 绘制标记
            painter->setBrush(brush); // 设置标记的颜色
            QPoint point(rect.topRight().x() - 15, rect.topRight().y() + 13);
            painter->drawEllipse(point, 3, 3); // 绘制一个小圆点作为标记

        }
#endif
        painter->restore();
    }
#endif


}

再来段QSS样式美化

cpp 复制代码
QWidget
{
	background-color:#00274F;
	color:#F0F0F0; 
}

/**********************************QCalendarWidget*****************************/
QCalendarWidget {
    font-size: 16px;
    min-width: 340px;
    min-height: 260px;
    color: white;

}

QCalendarWidget QAbstractItemView#qt_calendar_calendarview
{
    font-size: 16px;
    color: white;
    border: 1px solid #4b8eb5;
    background-color: rgb(7,34,64);
	selection-background-color:transparent;
    selection-color: white;

	/*  alternate-background-color:rgb(50,50,50);  */ 

}



QCalendarWidget QAbstractItemView#qt_calendar_calendarview:disabled
{
	color: rgb(67, 95, 106);
    border-color: #999999;
    background-color: #666666;
}


QCalendarWidget QWidget {
	alternate-background-color: rgb(7, 36, 70);
	border-image:none;
}


QCalendarWidget QToolButton#qt_calendar_prevmonth {
    width: 26px;
    height: 26px;
    qproperty-iconSize: 32px;
	border-image:none;

}

QCalendarWidget QToolButton#qt_calendar_nextmonth {
    width: 26px;
    height: 26px;
    qproperty-iconSize: 32px;
	border-image:none;

}
QCalendarWidget QToolButton:hover {
    background-color: rgb(7,37,72); /* 悬浮时的背景色 */
    color: rgb(0, 255, 255); /* 悬浮时的文字颜色 */
    /* 其他悬浮时的样式设置 */
}
QCalendarWidget QToolButton:precced {
    background-color: rgb(7,37,72); /* 悬浮时的背景色 */
    color: rgb(0, 255, 255); /* 悬浮时的文字颜色 */
    /* 其他悬浮时的样式设置 */
}
相关推荐
微学AI2 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡3 小时前
算法日记 - Day3
java·开发语言·算法
韭菜炒鸡肝天4 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Aaron - Wistron4 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
刀法孜然5 小时前
QT5.12.8开发中使用触摸屏,配置的环境变量,imx6ullpro开发板qt开发
qt
Dxy12393102165 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
0566466 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄6 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰6 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔6 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql