在尊重样式的同时从禁用的 QComboBox 中删除箭头
Remove arrow from disabled QComboBox while respecting style
在下图中,第一个QComboBox
被禁用:
我想强调一个事实,即不能通过删除已禁用 QComboBox
es 的箭头来更改该值。
我已经尝试修改已经用于:
的样式表
QComboBox::down-arrow:disabled {
border: 0;
background: transparent;
image: none;
height: 0;
width: 0;
}
但是并没有解决问题,而且和我现在的风格冲突(使用qApp->setStyle("fusion")
设置):
如何获取?
这个技巧可以通过使用 QProxyStyle
and returning a null QRect
for the arrow subcontrol (QProxyStyle::subControlRect
) 来完成。 QProxyStyle
允许您改变一种样式的特定行为,而无需实现一个全新的样式(它包装了原始样式)。
class MyProxyStyle : public QProxyStyle {
public:
MyProxyStyle(const QString& base_style_name) : QProxyStyle(base_style_name) {}
QRect MyProxyStyle::subControlRect(QStyle::ComplexControl cc,
const QStyleOptionComplex* option,
QStyle::SubControl sc,
const QWidget* widget) const override
{
if (cc == CC_ComboBox && sc == SC_ComboBoxArrow && !widget->isEnabled()) return QRect();
return QProxyStyle::subControlRect(cc, option, sc, widget);
}
};
// ...
qApp->setStyle(new MyProxyStyle("fusion"));
结果:
在下图中,第一个QComboBox
被禁用:
我想强调一个事实,即不能通过删除已禁用 QComboBox
es 的箭头来更改该值。
我已经尝试修改已经用于:
的样式表QComboBox::down-arrow:disabled {
border: 0;
background: transparent;
image: none;
height: 0;
width: 0;
}
但是并没有解决问题,而且和我现在的风格冲突(使用qApp->setStyle("fusion")
设置):
如何获取?
这个技巧可以通过使用 QProxyStyle
and returning a null QRect
for the arrow subcontrol (QProxyStyle::subControlRect
) 来完成。 QProxyStyle
允许您改变一种样式的特定行为,而无需实现一个全新的样式(它包装了原始样式)。
class MyProxyStyle : public QProxyStyle {
public:
MyProxyStyle(const QString& base_style_name) : QProxyStyle(base_style_name) {}
QRect MyProxyStyle::subControlRect(QStyle::ComplexControl cc,
const QStyleOptionComplex* option,
QStyle::SubControl sc,
const QWidget* widget) const override
{
if (cc == CC_ComboBox && sc == SC_ComboBoxArrow && !widget->isEnabled()) return QRect();
return QProxyStyle::subControlRect(cc, option, sc, widget);
}
};
// ...
qApp->setStyle(new MyProxyStyle("fusion"));
结果: