it编程 > 编程语言 > C/C++

Qt圆角窗口的两种实现方案详解

24人参与 2026-01-11 C/C++

前言:圆角之美

圆角窗口,乃现代ui设计之精髓,去棱角之锋芒,添界面之柔和。qt框架虽未原生提供圆角窗口,然开发者可自辟蹊径,实现此般效果。本文将详述两种主流方案,并辅以代码示例与应用案例,助君掌握此技。

方案一:重写paintevent之法

原理剖析

🖌️ 重写paintevent,乃qt绘图之根本。通过覆写此虚函数,可完全掌控窗口绘制过程,实现任意形状之窗口。

代码实现

void roundedwidget::paintevent(qpaintevent* event)
{
    qpainter painter(this);
    painter.setrenderhint(qpainter::antialiasing);  // 抗锯齿
    painter.setbrush(qt::white);                   // 背景色
    
    // 绘制圆角矩形
    painter.drawroundedrect(rect(), 15, 15);       // 15为圆角半径
    
    // 继续绘制其他内容...
}

优劣分析

优势

劣势

应用案例

📱 音乐播放器界面:需动态改变圆角大小以配合动画效果时,此方案尤为适用。

方案二:qss和qstyleoption

原理剖析

🎨 qss(qt style sheets) ,乃qt之样式表系统,类似css。结合qstyleoption,可实现高效圆角效果。

代码实现

// 设置窗口样式
setstylesheet("qwidget {"
              "background-color: white;"
              "border-radius: 15px;"
              "}");

// 必须设置的窗口标志
setattribute(qt::wa_translucentbackground);
setwindowflags(qt::framelesswindowhint);

关键点说明

🔑 注意事项

  1. 必须设置wa_translucentbackground属性
  2. 需移除窗口边框(framelesswindowhint)
  3. 样式表可外部文件化,便于维护

性能对比表

特性方案一方案二
实现复杂度
运行性能
可维护性
动态调整能力

应用案例

💻 设置对话框:静态圆角窗口,样式统一且无需频繁更新时,此方案最佳。

进阶技巧

阴影效果

🌑 添加阴影可增强圆角窗口的立体感:

// 方案二的增强版
setstylesheet("qwidget {"
              "background-color: white;"
              "border-radius: 15px;"
              "border: 1px solid #ccc;"
              "}");
qgraphicsdropshadoweffect* shadow = new qgraphicsdropshadoweffect;
shadow->setblurradius(10);
shadow->setoffset(3, 3);
setgraphicseffect(shadow);

性能优化

减少重绘区域:

// 在方案一中优化
void roundedwidget::paintevent(qpaintevent* event)
{
    if(!event->region().intersected(roundedarea).isempty()) {
        // 仅绘制需要更新的圆角部分
    }
}

结语

🛠️ 两种方案,各有所长。重写paintevent之法,灵活多变;qss方案,简洁高效。开发者当视具体需求而择。

📚 延伸阅读

总结

到此这篇关于qt圆角窗口两种实现方案的文章就介绍到这了,更多相关qt圆角窗口实现内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Hibernate处理多对多关系的实现示例

01-11

vs2019+qt工程中如何生成dump文件及调试详解

01-11

浅谈C语言中的 #define 宏定义

01-11

C++ io_uring的使用小结

01-11

一文详解为什么越来越多项目开始从JDK 8升级到JDK 21

01-11

c++中std::tuple、std::pair 、std::tie使用详解

01-08

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论