Qt 与 AWTK 对比踩坑
不要过度在 Designer 上嵌套 Box Layout
-
不要为了自适应把
.ui做成连续嵌套的 Box layout,例如layout1 -> layout2 -> layout3。 -
原因:Qt Designer 在 layout 里面复制粘贴和插入新控件很不顺手,连续嵌套后既要维护 layout 层级,又要维护控件本身,复杂页面的调整成本会非常高。
-
解决方法: 多级layout之间间隔留出无layout区交给代码调整,避免连续嵌套,比如layout1和3嵌套,layout2就不嵌套;
QScrollArea内容区、数据驱动列表等场景通常适合用QVBoxLayout,页面级相对位置和屏幕自适应(如保持离右 20px、离底 10px、随窗口同步可用区域)可交给代码处理; 控件基础尺寸、层级和可视结构仍尽量保留在 Designer 中,代码只维护 Designer layout 难以表达或维护的动态关系;
按键菜单单选控件不要使用 QRadioButton
-
不要在需要按键控制的菜单单选场景中使用
QRadioButton。 -
原因:Qt
QRadioButton与 AWTKradio_button的焦点和选中行为不同。启用autoExclusive后,Qt 会调整组内按钮的焦点策略,使焦点难以正常移出 group;使用方向键移动焦点时,原生逻辑还会自动选中获得焦点的按钮,从而同步修改 value。 -
解决方法:使用
QCheckBox承载单选按钮外观,关闭 Qt 原生autoExclusive,在点击、Space 或 Enter 激活时通过setChecked()手动保证组内唯一选中;也可以将该行为封装为项目自定义控件。
复杂按钮背景图和状态图标不要使用 QSS
-
当按钮选中状态需要将图片平铺或拉伸到整个背景,或者需要把 icon 绘制到特定区域时,例如给某个按钮做一个右上角打✔️的效果,不要使用 QSS 实现。
-
原因:QSS 的
background-image和border-image都难以精确复刻 AWTK 对背景图、icon 的平铺、拉伸、对齐和区域定位能力;Qt Designer 也没有 AWTK 针对背景图和 icon 提供的完整配置。QSS 尤其难以在同一状态下稳定实现背景图与独立 icon 的叠加绘制。 -
解决方法:封装自定义控件,在
paintEvent()中使用QPainter画布 API,通过drawPixmap()、drawIcon()等接口分别控制背景、状态图标、裁剪区域与绘制顺序。
Qt 没法像 AWTK 那样让子控件越界绘制
-
AWTK 通常将控件统一绘制到同一张 canvas,可以通过取消 clip 让子控件画到容器外;Qt Widgets 使用父子控件树,子
QWidget的绘制区域始终受父控件限制。
避免频繁调用 setStyleSheet
-
不要在页面每次
showEvent()或普通状态刷新时无条件重新setStyleSheet(),尤其不要在大菜单页根控件上反复应用整页 QSS。 -
原因:AWTK 更接近统一 canvas 绘制,改颜色通常只是影响后续绘制参数;Qt Widgets 的
setStyleSheet()会进入样式表解析、选择器匹配和控件 repolish 流程。即使新旧 QSS 字符串完全相同,Qt 也不会自动去重。控件已 polish 后再次调用setStyleSheet(),会对目标控件及其子孙控件重新匹配规则。QWidget#Page *、QWidget、*等宽泛后代选择器会进一步放大成本。 -
解决方法:
-
对仍需 QSS 的页面/组件,在
loadStyleSheet(int theme)内记录已应用主题,主题未变化时直接返回;不要把守卫一概放到onSwitchTheme(),避免跳过非 QSS 的状态同步。 -
纯色背景、圆角行背景、简单文本颜色等优先用
paintEvent()自绘,主题变化只更新颜色并update()。 -
复杂视觉必须保留 QSS 时,使用 objectName、具体控件类型或自定义属性精确匹配,避免
QWidget#Page *这类通配后代选择器。 -
不要指望
QPalette一定能替代 QSS;在父级样式表或自定义绘制链路下,文本颜色可能被覆盖。若要彻底绕开样式表机制,文本也应由控件自绘。
-

浙公网安备 33010602011771号