• 6331阅读
  • 12回复

[提问]自定义圆角窗口不够圆滑的角 [复制链接]

上一主题 下一主题
离线phpqinsir
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-17
经过辗转多天的努力,终于把QQ界面模仿得有模有样。就是资源问题没有得到解决。好在,这不是重点。今天,再次来问的问题是:通过设置背景图片,在重写事件里面重绘实现圆角,得到的圆角非常不平滑。说白了就是不够圆。让人看起来像是一像不太直的直线而已。
见图:


我看过其他用Qt开发的软件。比如:wps、录像大师、virtualBox这些软件。人家的圆做得挺不错。有边框,有阴影,最重要的是,能随着拉伸不影响圆解。


如果是做一个给定大小的圆角,直接做一张圆角带阴影的图片就搞定了。这也是网上许多朋友的解决方案。但是,这种方式不适合拉伸。悲催。


所以,想知道怎样的方式能达到这个目的。谢谢大家!这是我模仿QQ界面最后一道难关了。到时候我会贡献源码。谢谢!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线roywillow

只看该作者 1楼 发表于: 2012-12-17
先问一下你是怎么实现的?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线shiziyang

只看该作者 2楼 发表于: 2012-12-17
你要在resizeevent和paintevent里自己算mask和paint,方法需要做的和qss的border-image的九宫算法一样
离线tomtc123

只看该作者 3楼 发表于: 2012-12-17
离线phpqinsir
只看该作者 4楼 发表于: 2012-12-17
  1. // 重画软件界面。
  2. void MainWindow::paintEvent(QPaintEvent *event)
  3. {
  4.     QBitmap objBitmap(size());                      // 生成一张位图
  5.     QPainter painter(&objBitmap);                   // QPainter用于在位图上绘画
  6.     painter.setRenderHints(QPainter::Antialiasing
  7.                            | QPainter::HighQualityAntialiasing, true);  // 圆角平滑
  8.     painter.fillRect(rect(), Qt::white);            // 填充位图矩形框(用白色填充)
  9.     painter.setBrush(QColor(0, 0, 0));
  10.     painter.drawRoundedRect(this->rect(), 5, 5);    // 在位图上画圆角矩形(用黑色填充)
  11.     setMask(objBitmap);                             // 使用setmask过滤即可,被圆角切除部分用白色填充
  12. }

这就是我的实现方法。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 5楼 发表于: 2012-12-17
回 2楼(shiziyang) 的帖子
朋友,你这个貌似比较靠谱。至少是一种思路。今天晚上回家去尝试一下。不知道能否重给的时候实现类似于九宫格的这种方式。
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线shiziyang

只看该作者 6楼 发表于: 2012-12-17
回 4楼(phpqinsir) 的帖子
这样不行的吧,你这样画,最后的效果圆角肯定还是毛糙的,老老实实画一张带圆角的背景图吧
离线roywillow

只看该作者 7楼 发表于: 2012-12-17
话说之前是你问的吗……?
bitmap作为mask肯定不会带半透明过渡的吧
我的想法跟楼上一样
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 8楼 发表于: 2012-12-17
既然要做到那样的效果,9格是个好办法,自己paint可以获得很好的效果,但是改变起来很费劲,只能显示固定的界面效果,不能换肤。
paint做下面的固定效果很好。




发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线phpqinsir
只看该作者 9楼 发表于: 2012-12-17
回 8楼(jdwx) 的帖子
不能换肤这是小事儿。毕竟现在的软件都不能换肤。但是,目前从软件市场的趋势来看,换肤是一种趋势。我先把可拖动放大放小的圆角整理好是上策。你做的东西的确不错。九宫格我去尝试一下。毕竟,有两位大侠都提到了。只要有一个人提到我都会尝试。谢谢!!!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 10楼 发表于: 2012-12-17
回 7楼(roywillow) 的帖子
嗯。之前我问过,但是,大家都没有给出一个合理的思路。都是说换一个图像处理类。这种方式我去试了。效果没出来。现在QQ模仿到一定阶段了,再回过头来把最后的问题解决掉吧。谢谢你噢
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线phpqinsir
只看该作者 11楼 发表于: 2012-12-17
回家翻开我的C++ GUI 编程第二版,仔细研讨了九宫格。再加以例子,居然发现模仿QQ的那个拖动也能使圆角平滑。真的令人很兴奋。感谢各位大侠帮助。谢谢各位!!!
qtcn.org是我见过最热心的论坛,也是解决问题率最高的论坛。希望,我的问题能让更多的人少走弯路。
离线tangxunmin

只看该作者 12楼 发表于: 2013-08-21
回 11楼(phpqinsir) 的帖子
想请教下,如何解决的,主界面用的是widget还是form的??
快速回复
限100 字节
 
上一个 下一个