QTabBar 元素的样式 ::tab 会导致样式丢失

Posted

技术标签:

【中文标题】QTabBar 元素的样式 ::tab 会导致样式丢失【英文标题】:Styling ::tab of a QTabBar element results in style lose 【发布时间】:2011-10-09 21:22:44 【问题描述】:

在我的应用程序中,我想为 QTabBar 元素的选定选项卡设置样式。我设置的样式只是它的background-color,但是每次我改变它的background-color属性,其他所有的样式都会立即丢失。 起初我认为这只是 background-color 的问题,但后来尝试更多时,我注意到即使更改选项卡的边距,所有其他样式都丢失了。其他标签的background-color设置为透明,填充和边框也丢失了。

我认为 QT 的正确行为方式应该是保留我没有明确修改的属性,但是对于不实施这种明显的行为,必须有其他原因,或者我遗漏了一些东西。

这是一个实际的“错误”还是我在尝试设置标签样式时没有考虑到什么?

【问题讨论】:

【参考方案1】:

我相信您遇到的问题是,一旦您更改了 GUI 元素的样式,Qt 就无法再使用您操作系统的本机控件来绘制它。

当您更改任何类型的原生小部件(选项卡、组合框等)的样式时,您应该准备好手动控制该小部件的各个方面的样式,因为您说您不想要它看起来不再像原生小部件,Qt 必须使用不同的底层绘画系统来渲染小部件。

【讨论】:

我认为 QT 总是以相同的方式绘制,但使用从系统中获取的“CSS 属性”。嗯,我猜应该是这样的。 在后台,他们使用原生 API 调用使小部件看起来尽可能原生。 使用从系统中获取的“CSS 属性”——如果系统不提供任何属性会怎样——要么它会随意绘制,要么完全自己绘制? @j_kubik,我认为 QT 框架应该能够以某种方式将系统小部件样式转换为适当的 CSS 属性并将它们包含在级联中。但显然现在看来这不会发生。【参考方案2】:

@Mario 以及 Chris 已经说过的关于 CSS 样式覆盖本机操作系统样式的内容: 任何 CSS 样式的应用都会有效地调用

QWidget::setStyleSheet(const QString & styleSheet)

在目标 QWidget 上。这会用包含新 styleSheet 的 QString 覆盖先前设置的 styleSheet css;然后小部件会自行重置并解析新工作表。 Qt 不够聪明,无法检测到您的新样式表会影响小部件样式的哪些部分(以及不会影响哪些部分),除此之外,CSS 不支持切换是否应用特定属性。 Qt 需要添加删除功能以及添加 CSS 属性,以便在一个 Widget 上分层多个样式表才能工作(您可能还需要一个“RemoveAllStyling()”函数)。

【讨论】:

以上是关于QTabBar 元素的样式 ::tab 会导致样式丢失的主要内容,如果未能解决你的问题,请参考以下文章

QTabWidget怎么让tab自适应大小

react antd Tabs组件如何修改默认样式-友好的解决方法

如何使用 width: auto 使选项卡的宽度随文本内部的变化而变化在 Qt5 中的 QTabBar::tab 中?

QTabBar 选项卡大小不随样式表字体缩放

Firefox 在使用 Tab 时会忽略选定元素上的轮廓和焦点样式

QTabBar 图标位置