• 14049阅读
  • 12回复

Qt实现圆角窗口理论上来说不难 [复制链接]

上一主题 下一主题
离线jorneyr
 

只看楼主 倒序阅读 楼主  发表于: 2011-10-09




Qt理论上能很容易的实现圆角窗口,但不知道Nokia为什么不去做。
如上图的圆角效果看上去很完美,这个圆角是使用mask + stylesheet来实现的,实现的方式非常另类。
1. mask为1x1的图片
2. 主窗口随便使用一个QWidget,在上面设置Mask
3. 添加一个QLineEdit到此widget里,设置此QLineEdit的水平和垂直 size policy 都为expanding,并为它使用style sheet设置圆角:
    border: 2px dashed black;
    border-radius: 10px;
4. 然后所有的组件都添加到这个QLineEdit里即可,自由的使用QLayout布局所有的子组件。
5. 显示主窗口即可以看到图中的效果。


思考:
使用Mask的时候,如QLineEdit,QPushButton, QTextEdit等可以显示出来。
但如QFrame,QWidget,QLabel却完全是透明的,即使设置setAutoFillBackground(true)也不行,设置了palette的Base, Window等角色都还是不行。

不过却可以说明,如果QWidget绘制不透明背景使用如QLineEdit的方式,那么就可以很容易的使用QWidget来实现圆角窗口了,只要设置一下style sheet就能实现。
1. 不使用QLineEdit等来作为窗口容器,是因为不能在Designer里直接往他们内部放组件
2. 上面的实现中,QLineEdit的子组件如QLabel还是不能绘制出背景,只有QPushButton等可以。


至少通过上面的例子,可以知道Qt从理论上来说可以很方便的实现圆角窗口,而且圆角只需要使用style sheet就能实现。
可是,如此简单的方式,Nokia至少现在还没有提供。

离线jdwx

只看该作者 1楼 发表于: 2011-10-09
事实上Qt提供的功能非常够用,可以做任何窗口。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jorneyr

只看该作者 2楼 发表于: 2011-10-09
引用第1楼jdwx于2011-10-09 22:13发表的  :
事实上Qt提供的功能非常够用,可以做任何窗口。

你的这个窗口看上去非常舒服,怎么实现的呢?
离线jorneyr

只看该作者 3楼 发表于: 2011-10-09
因为你的这个窗口圆角有反锯齿功能,Windows XP的窗口圆角默认也没有这个功能,必须使用WindowBlind这种软件才能实现。
离线jdwx

只看该作者 4楼 发表于: 2011-10-10
回 3楼(jorneyr) 的帖子
本人这个是纯正Qt窗口在XP下运行,看看滚动条,还是XP样式。
还得说:乔布斯厉害啊(可惜死的太早了),那个macosx的配色很好。



发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jorneyr

只看该作者 5楼 发表于: 2011-10-10
Re:回 3楼(jorneyr) 的帖子
引用第4楼jdwx于2011-10-10 09:23发表的 回 3楼(jorneyr) 的帖子 :
本人这个是纯正Qt窗口在XP下运行,看看滚动条,还是XP样式。
还得说:乔布斯厉害啊(可惜死的太早了),那个macosx的配色很好。
.......

可以看看你的代码吗?非常感兴趣。
离线fuzhongyao
只看该作者 6楼 发表于: 2011-10-10
是不是nokia追求反应速度啊。听说style sheet会影响速度。
离线jorneyr

只看该作者 7楼 发表于: 2011-10-11
引用第6楼fuzhongyao于2011-10-10 17:35发表的  :
是不是nokia追求反应速度啊。听说style sheet会影响速度。

应该影响不大,style sheet最终都被编译成了QStyle这个类的实现
离线ninsun

只看该作者 8楼 发表于: 2011-10-12
将主QWidget设置成全透明,
子QWidget设置一个有透明效果的背景图可以实现任意样子的窗口什么的我会到处乱说嘛……
  1. setWindowFlags(Qt::FramelessWindowHint);
  2.     setAttribute(Qt::WA_TranslucentBackground);
嗯,这样设置一下主窗口……然后顺便使用最大化的方式显示出来……
你就拥有了一个在整个桌面上“绘制”的能力了……


只看该作者 9楼 发表于: 2011-10-12
引用第7楼jorneyr于2011-10-11 10:11发表的  :
应该影响不大,style sheet最终都被编译成了QStyle这个类的实现

实际上底层仍然每次都去解析那个stylesheet的字符串...
离线roywillow

只看该作者 10楼 发表于: 2011-10-12
回 1楼(jdwx) 的帖子
话说标题栏中的那个文字效果是怎么绘制出来的?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 11楼 发表于: 2011-10-12
回 10楼(roywillow) 的帖子
那个容易,启用抗锯齿,先用浅颜色输出文本,再用深颜色输出一次文本。
两次文本的位置差一个像素,深色比浅色位置往上(或左上)一个像素。
自己试试哪个效果好。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jdwx

只看该作者 12楼 发表于: 2011-10-12
回 10楼(roywillow) 的帖子
其实装一个PS,把图片放大什么都能看出来。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个