将 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
。但是您不需要在整个窗口上运行它,只需要在修改后的小部件上运行。
对我来说,它不适用于“父母”级别,只有当我在 QLineEdit
itself 上这样做时,请参阅我自己的答案 ***.com/a/48321977/356726【参考方案2】:
这是我自己的发现:
polish
/ unpolish
的工作原理
但是,这有点不方便,因为我必须为每个 QLineEdit
对象应用它,如果我在父级别(例如,在具有多个 QLineEdit
s 的对话框上)这样做,它对我不起作用李>
对我有用的是强制进行这样的更新
widget->setStyleSheet(widget->styleSheet());
,只需设置相同的样式表。我也在***小部件上工作,更新多个子元素。
【讨论】:
以上是关于将 QWidget 样式设置为只读后更新的主要内容,如果未能解决你的问题,请参考以下文章
QWidget::repaint:更新进度条时检测到递归重绘