将 QWidget 样式设置为只读后更新

Posted

技术标签:

【中文标题】将 QWidget 样式设置为只读后更新【英文标题】:Updating QWidget style after setting it readonly 【发布时间】:2018-01-07 20:23:04 【问题描述】:

我有 QLineEdit 的 Qt 样式表 (qss),使用不同的样式进行只读和可编辑。工作正常,但如果我将 QLineEdit 切换为只读(在运行时),样式不会改变。

有没有办法强制更新此类行编辑的样式表?

根据要求,样式表:

QLineEdit 
  background: transparent;
  border: 1px solid green;
  border-radius: 5px;


QLineEdit[readOnly="true"] 
  background: rgba(40,40,40);
  border: 1px solid rgba(50,50,50);

【问题讨论】:

你能发布你正在使用的样式表吗? 按要求添加样式表 这是 Qt 样式表的一个已知限制,当您将 CSS 设置到您的小部件时,它只会被处理一次。如果之后更改任何属性,则需要再次强制处理 CSS:wiki.qt.io/Dynamic_Properties_and_StylesheetsmyLineEdit->style()->unpolish(myLineEdit); myLineEdit->style()->polish(myLineEdit); 【参考方案1】:

更改编辑状态后尝试下一个代码:

qApp->style()->unpolish(this);
qApp->style()->polish(this);

其中“this”当前 QMainWindow 或 QDialog。

【讨论】:

只是widget->polish(); widget->unpolish();波兰语应该是第一位的 它有效。但行为严重依赖于平台。 根据Qt wiki,首先是unpolish。但是您不需要在整个窗口上运行它,只需要在修改后的小部件上运行。 对我来说,它不适用于“父母”级别,只有当我在 QLineEdititself 上这样做时,请参阅我自己的答案 ***.com/a/48321977/356726【参考方案2】:

这是我自己的发现:

polish / unpolish 的工作原理 但是,这有点不方便,因为我必须为每个 QLineEdit 对象应用它,如果我在父级别(例如,在具有多个 QLineEdits 的对话框上)这样做,它对我不起作用李>

对我有用的是强制进行这样的更新 widget->setStyleSheet(widget->styleSheet());,只需设置相同的样式表。我也在***小部件上工作,更新多个子元素。

【讨论】:

以上是关于将 QWidget 样式设置为只读后更新的主要内容,如果未能解决你的问题,请参考以下文章

QWidget::repaint:更新进度条时检测到递归重绘

如何使用样式表设置 qwidget 的背景颜色?

如何将 QMenu 中的 QAction 转换为 QWidget?

qt qwidget 怎么设置样式

QWidget - 从 C++ 代码设置边框

在 Qt 中为整个小部件设置样式表