• 993阅读
  • 9回复

Qt 开发自定义圆角窗体支持深色浅色切换 [复制链接]

上一主题 下一主题
离线boylebao
 

        辞职一个月,在家肝了一个月,把之前的代码整理了一下。
这个圆角窗体最大的特点:
  1. 圆角,所有窗体都可以填充到该窗体中,相当于一个壳。
  2. 深色/浅色无隙切换,支持自动切换,通过定时获取当前时间来判断,当到晚上6点时就会切换为深色模式。
  3. 支持双击标题最大化,窗口最大时拖动还原窗口,拖动到顶部时最大化,左右分屏(这些不是调用系统API实现的,自己判断的,所以并不能与系统自带的那么完美)
  4. 标题栏按钮,最大、最小、关闭、模式切换按钮都是通过绘制实现的。
  5. 实现了自定义的对话框,代替了QMessageBox
  6. 可以更换不同的肤色,现在的风格是蓝色风,可以配不同的肤色。



    关于是否开源,暂不会开源的,仅供大家欣赏与交流 ,谢谢!







4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 03-31
20091001753 贡献值 +1 - 03-31
20091001753 威望 +1 - 03-31
20091001753 金钱 +10 - 03-31
为Qt打造具有强大生产力的软件。
离线maxlogo

只看该作者 1楼 发表于: 04-01
很明显看到圆角下面不是透明的?
个人博客:
简书:https://www.jianshu.com/u/14fa805306bd
CSDN:https://blog.csdn.net/qq10097355
思否:https://segmentfault.com/u/lowbees/articles
离线boylebao

只看该作者 2楼 发表于: 04-01
回 maxlogo 的帖子
maxlogo:很明显看到圆角下面不是透明的? (2022-04-01 11:59) 

因为截图的原因,四个角是桌面背景
为Qt打造具有强大生产力的软件。
离线ysu533

只看该作者 3楼 发表于: 04-01
巧了,这两天也刚帮同事搞完圆角。 不知道你是怎么实现的,个人感觉还是挺简单的。setMask + mask后的锯齿修复就可以了。

PS:我认为你这些都挺好实现的,就是一点上面你没说的。移动窗口操作是如何适配高分屏启用的(多显示屏,不同缩放系数)。
注意我上面的移动不仅限于鼠标移动。包括直接调用 move 或 setGemotry 函数是否正常。 我一直没搞定这个。
离线boylebao

只看该作者 4楼 发表于: 04-01
回 ysu533 的帖子
ysu533:巧了,这两天也刚帮同事搞完圆角。 不知道你是怎么实现的,个人感觉还是挺简单的。setMask + mask后的锯齿修复就可以了。
PS:我认为你这些都挺好实现的,就是一点上面你没说的。移动窗口操作是如何适配高分屏启用的(多显示屏,不同缩放系数)。
注意我上面的移动不仅限于鼠标移 .. (2022-04-01 21:18) 

圆角,我是利用qss和paintEvent结合实现的,我并没有在高分屏上测试过,不好给意见,至于移动操作,我的最外层还是widget,所以它还是矩形,直接调用move和setGemotry是没问题,你用setMask的方式是不是实现不规则的窗口,所以导致移动窗体不正常呢?
为Qt打造具有强大生产力的软件。
离线ysu533

只看该作者 5楼 发表于: 04-02
回 boylebao 的帖子
boylebao:圆角,我是利用qss和paintEvent结合实现的,我并没有在高分屏上测试过,不好给意见,至于移动操作,我的最外层还是widget,所以它还是矩形,直接调用move和setGemotry是没问题,你用setMask的方式是不是实现不规则的窗口,所以导致移动窗体不正常呢? (2022-04-01 22:58) 

移动和setmask没关系,我指的是开启hidpi支持后,跨屏操作。如果没开hidpi,也没有多屏(且需要缩放系数不一样)当然没问题啊。 您这样实现,加入我左上叫的图标在布局里面是靠近最左上位置的(即距离左上没有任何空隙),那窗体还是圆角吗?如果不是的话,就意味着您这个框架很容易被塞进去的复杂子窗口破坏掉圆角。


离线boylebao

只看该作者 6楼 发表于: 04-02
回 ysu533 的帖子
ysu533:移动和setmask没关系,我指的是开启hidpi支持后,跨屏操作。如果没开hidpi,也没有多屏(且需要缩放系数不一样)当然没问题啊。 您这样实现,加入我左上叫的图标在布局里面是靠近最左上位置的(即距离左上没有任何空隙),那窗体还是圆角吗?如果不是的话,就意味着您这个框架很 .. (2022-04-02 09:41) 

我这里填充的widget是填充到这个圆角窗体的中间部分,首先我这个圆角窗体分三部分:titleBarWidget,centerWidget,bottomWidget。标题栏是不会变的,中间部分可以填充一个widget布局在里面,底部也可以填充,所以填充进去的widget不会破坏圆角窗体
为Qt打造具有强大生产力的软件。
离线ysu533

只看该作者 7楼 发表于: 04-02
回 boylebao 的帖子
boylebao:我这里填充的widget是填充到这个圆角窗体的中间部分,首先我这个圆角窗体分三部分:titleBarWidget,centerWidget,bottomWidget。标题栏是不会变的,中间部分可以填充一个widget布局在里面,底部也可以填充,所以填充进去的widget不会破坏圆角窗体 (2022-04-02 10:47)

没明白, 能给个编译好的二进制包不。

或者帮忙测试下,加点代码:
auto label = new QLabel(this);// this 为toplevelWidget
label->setFixedSize(40, 40);
label->setStyleSheet("background:red");
label->move(0, 0);
试试这样圆角会不会被这个红色块挡住。


离线boylebao

只看该作者 8楼 发表于: 04-02
回 ysu533 的帖子
ysu533:没明白, 能给个编译好的二进制包不。
或者帮忙测试下,加点代码:
auto label = new QLabel(this);// this 为toplevelWidget
....... (2022-04-02 16:01) 

我想你这段代码肯定会遮挡圆角的,如果label的父类是圆角,你又把它移动到0,0位置,就是移动到父类的0,0位置,那肯定会挡的,要么你把label也设置同样的圆角
为Qt打造具有强大生产力的软件。
离线ysu533

只看该作者 9楼 发表于: 04-05
回 boylebao 的帖子
boylebao:我想你这段代码肯定会遮挡圆角的,如果label的父类是圆角,你又把它移动到0,0位置,就是移动到父类的0,0位置,那肯定会挡的,要么你把label也设置同样的圆角 (2022-04-02 23:53) 

嗯嗯,所以这个方案不适合太复杂的UI。而且上面如果是浏览器或视频的话,又可能有别的问题。setMask 可以避免这个问题。
快速回复
限100 字节
 
上一个 下一个