QT中修改QCalendarWidget样式时,令周几(表头)与日期文字颜色不同的方法,设置文字样式冲突的问题

2023-11-20

太长不看版

Qt日历中使用setWeekdayTextFormat修改周末文字颜色和setHeaderTextFormat修改表头文字颜色发生冲突,通过找到每个周末日期来修改文字颜色。效果图和代码见文末


在Qt中用到了QCalendarWidget,根据设计给出的设计图,需对其进行修改,搜索一下有很多可以参考的方法,比如这个就比较完善了,但还需要进行一些修改

修改周末的颜色

把周末的红色去掉,改成和周一-周五一致,可调用setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek, const QTextCharFormat &format)进行设置

QCalendarWidget* calendar = new QCalendarWidget(this);
QTextCharFormat weekendFormat;
weekendFormat.setForeground(QBrush(Qt::gray));
calendar->setWeekdayTextFormat(Qt::Saturday, weekendFormat);
calendar->setWeekdayTextFormat(Qt::Sunday, weekendFormat);

这样一顿操作之后获得的日历如下图所示

image.png

修改表头周x的颜色

但根据设计图,需要在保持【2】区域白底灰字的前提下,将【1】区域改为灰底白字,翻阅QCalendarWidget的函数,发现有一个setHeaderTextFormat(const QTextCharFormat &format) 但尝试之后发现会出现以下情况:
image.png
可以发现表头周末的文字颜色并没有改变,仔细看以下Qt文档可以发现

void QCalendarWidget::setHeaderTextFormat(const QTextCharFormat &format)
Sets the text char format for rendering the header to format. If you also set a weekday text format, this format’s foreground and background color will take precedence over the header’s format. The other formatting information will still be decided by the header’s format.

因为在前面对周末设置了weekday text format,所以在这里表头样式对周末不起作用。
搜索一番找到一个可能有参考意义的方案,不过这个是修改表头的背景颜色,根据这个思路去翻了一下QCalendarModelformatForCell(int, int) 的源码,发现是长这样的:

    format.setBackground(pal.brush(cg, header ? QPalette::AlternateBase : QPalette::Base));
    format.setForeground(pal.brush(cg, QPalette::Text));

佛了,为什么背景知道要区分是不是表头,前景色就不管了
到这里好像没有什么直接修改表头文字颜色的好办法了,重写QCalendarWidget类也比较麻烦,还不如把源码贴到项目里改个名。

最后的解决办法

不过办法总是有的,就是笨一点,这里用到了setDateTextFormat(QDate , QTextCharFormat) 函数,既然有冲突那就不设置特定星期x的样式,而是设置好表头样式,再一天天的设置每个属于周末的日期的文字样式,代码如下

// slot

void MyWidget::UpdateCldColor(int y, int m) {
	QTextCharFormat dateFormat;
	dateFormat.setForeground(QBrush(Qt::gray));
	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) {
			calendar->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;
			calendar->setDateTextFormat(curdate, dateFormat);
			curdate = curdate.addDays(1);
			curday = curdate.dayOfWeek();
			curmonth = curdate.month();
		}
		curdate = curdate.addDays(5);
		curday = curdate.dayOfWeek();
		curmonth = curdate.month();
	}
}
// 对calendar设置

calendar = new QCalendarWidget(this);
// 设置表头Mon - Fri颜色
QTextCharFormat fmt;
fmt.setForeground(QBrush(Qt::white));
fmt.setBackground(QBrush(Qt::gray));
calendar->setHeaderTextFormat(fmt);
//设置表头Sat - Sun颜色
QTextCharFormat weekendFormat;
weekendFormat.setForeground(QBrush(Qt::white));
calendar->setWeekdayTextFormat(Qt::Saturday, weekendFormat);
calendar->setWeekdayTextFormat(Qt::Sunday, weekendFormat);
// 出现时先调用一次
UpdateCldColor(calendar->monthShown(), calendar->yearShown());
// 每次翻页重新绘制
connect(calendar, SIGNAL(currentPageChanged(int, int)), this, SLOT(UpdateCldColor(int, int)));

最终效果如下
image.png
完成!如果有其他更好的办法欢迎指出~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中修改QCalendarWidget样式时,令周几(表头)与日期文字颜色不同的方法,设置文字样式冲突的问题 的相关文章

随机推荐

  • Python 正则表达式指南

    文章目录 1 正则表达式基础 1 1 简单介绍 1 2 数量词的贪婪模式与非贪婪模式 1 3 反斜杠的困扰 1 4 匹配模式 2 re模块 2 1 开始使用re 2 2 Match 2 3 Pattern 1 正则表达式基础 1 1 简单介
  • Vue2基础框架(js)

    快捷方式 vba div div
  • IO相关-这一篇全了解

    什么是比特 什么是字节 什么是字符 它们长度是多少 各有什么区别 解 Bit最小的二进制单位 是计算机的操作部分 取值0或者1 Byte是计算机操作数据的最小单位由8位bit组成 取值 128 127 Char是用户的可读写的最小单位 在J
  • 由一个多线程共享Integer类变量问题引起的。。。

    假设并发环境下 业务代码中存在一些统计操作 为了保证线程安全 开发人员往往会对计数值进行加锁 synchronized 值得注意的是 直接对Integer类型进行加锁 似乎并不会达到预期效果 比如下面这段代码 Integer num new
  • java 视频压缩

    原文链接 https blog csdn net SeniorShen article details 113246990 1 引入依赖
  • C++拷贝构造函数的使用:创建类Dog 成员变量name age 。完成该类的定义,该类包含构造函数,拷贝构造函数 析构函数

    创建类Dog 成员变量name age 大家完成该类的定义 该类包含构造函数 拷贝构造函数 析构函数 拷贝构造函数的作用 拷贝构造函数作用就是利用该类的一个对象是初始化另一个该类的对象 换句话说就是 拷贝构造函数的作用 通过一个对象对该类的
  • 使用ADB命令来测试Android手机App的耗电量

    1 使用WiFi连接手机 先使用USB数据线连接手机和电脑 手机和电脑连接同一个WiFi 启动端口服务 adb tcpip 5555 5555为端口号 可以自由指定 打印 restarting in TCP mode port 5555 表
  • 如何用Stata完成(shui)一篇经济学论文(十一):分组和去重

    文章目录 分组 去重 不出意外的话 这应该是stata有关数据处理的最后一篇 emmm 其实我一开始只打算写数据处理部分的stata教程 因为我觉得对于我来说 数据处理才是最头疼的部分 不过关于后面回归 还是有些东西想跟大家分享一下 开始挖
  • Halcon直线检测

    1 Halcon最常用的直线检测算子 add metrology object line measure 利用Halcon封装好的模型不仅可以检测直线 还可以检测圆 椭圆 矩形等 下面介绍下其余的直线检测的算子 需要配合 skeleton
  • CentOS7安装postgresql

    目录 1 安装postgresql 2 postgresql基本使用 常用启停命令 常用配置文件 常用postgresql命令 官网地址 https www postgresql org 1 安装postgresql 1 1 进入官网 点击
  • 两点。。。等来金蝶中间件的面试通知

    晚上笔试 说是大约一点通知 等到十二点 困了 上床 睡不着啊 1点半翻起来 打开手机 没有 打开Gmail 没有 于是抽了支烟 等到两点多一点 手机响了 接到面试通知 下午一点 石头终于落地 因为上午还有一场网易游戏的笔试 担心冲突 还好
  • Linux编辑器——vim的使用

    文章目录 1 vim的三种模式 2 vim的基本操作 3 vim的配置 前言 Linux上的编辑器有很多 比如nano vi vim等 nano是最简单的编辑器 vim编辑器常用于写代码 因为vim的功能强大 写代码快捷方便 其可以主动的用
  • 16.1 C++智能指针-new/delete探秘

    16 1 C 智能指针 new delete探秘 16 2 C 智能指针 shared ptr 16 3 C 智能指针 weak ptr 16 4 C 智能指针 shared ptr使用场景 陷阱 性能分析与使用建议 16 5 C 智能指针
  • Queue队列简介说明

    转自 Queue队列简介说明 下文笔者讲述Queue队列的简介说明 如下所示 Queue队列简介 Queue也是Java集合框架中定义的一种接口 直接继承自 Collection 接口 除了基本的Collection接口规定测操作外 Que
  • 制作一个多语言谷歌翻译 脚本

    1 修改host文件 C Windows System32 drivers etc 加入以下配置 google translate 203 208 40 66 translate google com google translate ap
  • 成功的硬件公司不仅是产品,更是一种创新文化

    目录 内容简介 客户 建立公司 而不仅仅是产品 CSDN学院 作者简介 内容简介 很多时候 你决定去做一件事 一款产品 往往都始于一个想法 一个灵感 然后 许多硬件创业者会花费数月 甚至是数年的时间来确定并分析他们的想法或者说是创意 一旦产
  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • 腾讯云函数的Python依赖库打包注意事项

    云函数Python3 6依赖库 官网文档链接 前两天写了一个Python程序要用pycryptodome库 但是腾讯云函数并没有自带这个库 感觉还是记录一下比较好 要使用CentOS 7下的Python Python版本要是3 6的 我一开
  • VIM选择文本块/复制/粘贴

    在正常模式下 按ESC进入 按键v进入可视化模式 然后按键盘左右键或h l键即可实现文本的选择 其它相关命令 v 按字符选择 经常使用的模式 所以亲自尝试一下它 V 按行选择 这在你想拷贝或者移动很多行的文本的时候特别有用 CTRL v 按
  • QT中修改QCalendarWidget样式时,令周几(表头)与日期文字颜色不同的方法,设置文字样式冲突的问题

    太长不看版 Qt日历中使用setWeekdayTextFormat修改周末文字颜色和setHeaderTextFormat修改表头文字颜色发生冲突 通过找到每个周末日期来修改文字颜色 效果图和代码见文末 在Qt中用到了QCalendarWi