【问题标题】:Forcing a recalcuation of Qt Stylesheet appears to do nothing强制重新计算 Qt 样式表似乎无济于事
【发布时间】:2018-01-26 22:11:12
【问题描述】:

使用样式表我正在尝试更改窗口的样式,包括所有子窗口。

所有子项都使用setObjectName 命名,样式表使用相同的名称来更改命名小部件的样式(以及一些永远不需要更改的摘录)。我正在重新计算样式表,首先将值插入std::map,将名称(例如QWidget#hello!hover)映射到一组键值对,例如background-color#0f0f0f。 IE。 ["QWidget#hello!hover"]["background-color"] = "#0f0f0f",将是一个条目。

当样式表映射发生变化时,我会重新计算整个样式表,并在主窗口小部件上使用setStyleSheet 设置它,并在顶部添加/* */(据推测,这应该会强制重新计算样式表)。但是,这似乎根本没有做任何事情。

这样做,在主小部件的构造函数中可以正常工作,但一旦设置它就不会做任何事情。

我计算的样式表是有效的,并且所有条目都按照我期望的方式排序,所有小部件都有预期的名称,并且由于它在我第一次设置它时工作,我怀疑问题是要么新的样式表没有效果,或者它对孩子没有效果。

我在 Windows 10 上使用 Qt 5.4(最初为 Qt3 开发的旧垃圾软件)。

我该如何解决这个问题?

【问题讨论】:

  • 没有确切的例子很难说,但是。 1)尝试默认使用“Fusion”风格。 2) 要“重新加载”样式表,您需要调用 w->polish();w->unpolish(); 而不重置样式表。 3)你的CSS看起来很奇怪。是伪代码吗?
  • @DmitrySazonov 如果仅通过在所有子项上设置样式表来解决问题。

标签: c++ css qt


【解决方案1】:

我通过在主小部件的所有子部件上设置样式表解决了这个问题。在计算出新的样式表并将其存储在一个名为stylesheetQString 中后,我使用了:

QList<QWidget*> children = findChildren<QWidget*>(); 
for (QList<QWidget*>::iterator child = children.begin(); child != children.end(); ++child);
    (*child)->setStyleSheet(stylesheet);

一切都像一个魅力。这些变化非常少见,而且窗口中没有太多东西,所以这样做的成本并不是什么大问题——我相信它可以更有效地完成。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2016-11-02
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多