下午好🌅🌅🌅
本答案参考通义千问
要实现仅设置背景色而不覆盖日期文本的效果,你需要在绘制日期文本之前和之后分别保存和恢复 QPainter 的状态,并且使用透明度来绘制背景色。这样,日期文本仍然可以显示在背景色之上。
以下是修改后的 paintCell 方法:
void MyCalendar::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{
QCalendarWidget::paintCell(painter, rect, date);
QVector<int> vecMonthDays = {1, 3, 7, 8, 12, 21}; // 测试天数
// 检查当前日期是否在
if (vecMonthDays.contains(date.day()))
{
painter->save();
painter->setOpacity(0.5); // 设置透明度
painter->fillRect(rect, Qt::green);
painter->restore();
}
else
{
painter->save();
painter->setOpacity(0.5); // 设置透明度
painter->fillRect(rect, Qt::red);
painter->restore();
}
}
详细步骤
-
保存和恢复 QPainter 状态:
- 使用
painter->save(); 和 painter->restore(); 来确保每次绘制后 QPainter 的状态被正确恢复。
-
设置透明度:
- 使用
painter->setOpacity(0.5); 来设置透明度。这可以使背景色半透明,从而不会完全覆盖日期文本。
-
填充背景色:
- 使用
painter->fillRect(rect, Qt::green); 或 painter->fillRect(rect, Qt::red); 来填充背景色。
完整示例代码
#include <QCalendarWidget>
#include <QPainter>
#include <QVector>
class MyCalendar : public QCalendarWidget
{
public:
MyCalendar(QWidget *parent = nullptr) : QCalendarWidget(parent) {}
protected:
void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const override
{
QCalendarWidget::paintCell(painter, rect, date);
QVector<int> vecMonthDays = {1, 3, 7, 8, 12, 21}; // 测试天数
// 检查当前日期是否在
if (vecMonthDays.contains(date.day()))
{
painter->save();
painter->setOpacity(0.5); // 设置透明度
painter->fillRect(rect, Qt::green);
painter->restore();
}
else
{
painter->save();
painter->setOpacity(0.5); // 设置透明度
painter->fillRect(rect, Qt::red);
painter->restore();
}
}
};
解释
- 透明度设置:通过
painter->setOpacity(0.5); 设置透明度,使得背景色不会完全覆盖日期文本,同时保持一定的视觉效果。 - 填充矩形:使用
painter->fillRect(rect, Qt::green); 或 painter->fillRect(rect, Qt::red); 来填充背景色。 - 保存和恢复状态:通过
painter->save(); 和 painter->restore(); 确保每次绘制后 QPainter 的状态被正确恢复。
这样,你可以实现既设置背景色又保留日期文本的效果。