查看完整版本: [-- Qt 开发自定义圆角窗体支持深色浅色切换 --]

QTCN开发网 -> Qt 作品展 -> Qt 开发自定义圆角窗体支持深色浅色切换 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

boylebao 2022-03-31 22:36

Qt 开发自定义圆角窗体支持深色浅色切换

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



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

[attachment=22806]

[attachment=22807]


[attachment=22808]

maxlogo 2022-04-01 11:59
很明显看到圆角下面不是透明的?

boylebao 2022-04-01 12:39
maxlogo:很明显看到圆角下面不是透明的? (2022-04-01 11:59) 

因为截图的原因,四个角是桌面背景

ysu533 2022-04-01 21:18
巧了,这两天也刚帮同事搞完圆角。 不知道你是怎么实现的,个人感觉还是挺简单的。setMask + mask后的锯齿修复就可以了。

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

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

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

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

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



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

我这里填充的widget是填充到这个圆角窗体的中间部分,首先我这个圆角窗体分三部分:titleBarWidget,centerWidget,bottomWidget。标题栏是不会变的,中间部分可以填充一个widget布局在里面,底部也可以填充,所以填充进去的widget不会破坏圆角窗体

ysu533 2022-04-02 16:01
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 2022-04-02 23:53
ysu533:没明白, 能给个编译好的二进制包不。
或者帮忙测试下,加点代码:
auto label = new QLabel(this);// this 为toplevelWidget
....... (2022-04-02 16:01) 

我想你这段代码肯定会遮挡圆角的,如果label的父类是圆角,你又把它移动到0,0位置,就是移动到父类的0,0位置,那肯定会挡的,要么你把label也设置同样的圆角

ysu533 2022-04-05 09:08
boylebao:我想你这段代码肯定会遮挡圆角的,如果label的父类是圆角,你又把它移动到0,0位置,就是移动到父类的0,0位置,那肯定会挡的,要么你把label也设置同样的圆角 (2022-04-02 23:53) 

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


查看完整版本: [-- Qt 开发自定义圆角窗体支持深色浅色切换 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled