【问题标题】:How to change color for inactive days in QDateEdit or QCalendarWidget如何在 QDateEdit 或 QCalendarWidget 中更改非活动天数的颜色
【发布时间】:2021-06-07 02:49:57
【问题描述】:

请帮帮我,我的朋友们!我需要这样的日历小部件: desired calendar

但我有一个问题。我只得到这个: my calendar

我需要这样做:超出范围的日期(minimalDate、maximalDate)应着色为非活动日期(例如,活动日期的主颜色为黑色,非活动日期的主颜色为灰色)。对不起我的英语不好:)

我正在尝试这样写:

/* activel days */
QCalendarWidget QAbstractItemView:enabled 
{
    font-size:24px;  
    color: rgb(180, 180, 180);  
    background-color: black;  
    selection-background-color: rgb(64, 64, 64); 
    selection-color: rgb(0, 255, 0); 
}
 
/* days inactive */
QCalendarWidget QAbstractItemView:disabled { color: rgb(64, 64, 64); }

【问题讨论】:

  • 我认为 QSS 无法做到这一点。您应该创建从QCalendarWidget 派生的自定义日历并实现void QCalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
  • @Alloces,如何做到这一点?我试过了,但没有...

标签: qt qcalendarwidget qdateedit


【解决方案1】:

您应该创建自己的从QCalendarWidget 派生的自定义日历类并重新实现void QCalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const 方法。

所以让我们在 Calendar.h 中创建一个Calendar 类:

#include <QCalendarWidget>

class Calendar : public QCalendarWidget
{
public:
    Calendar(QWidget *parent = nullptr);
    void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const override;
};

Calendar.cpp中实现这个类:

#include "Calendar.h"

#include <QPainter>

Calendar::Calendar(QWidget *parent)
    : QCalendarWidget(parent)
{}

void Calendar::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{
    // change color for dates before current date
    if (date < QDate::currentDate())
    {
        painter->save();
        // set color for the text
        painter->setPen(QColor(64, 64, 64));
        // draw text with new color
        painter->drawText(rect, Qt::TextSingleLine | Qt::AlignCenter, QString::number(date.day()));

        // here you can draw anything you want       

        painter->restore();
    } else {
        // draw cell in standard way
        QCalendarWidget::paintCell(painter, rect, date);
    }
}

然后,如果您使用的是Qt Creator,您可以将左侧栏中的QCalendarWidget 添加到您的小部件,右键单击它并打开推广到菜单。将Calendar 添加到Promoted class name 并检查Header file 是否正确。点击 AddCalendar 添加到提升的类列表中,最后点击 Promote 将表单上的 QCalendarWidget 转换为 Calendar

之后,我得到以下小部件(抱歉,俄语):

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多