自定义QSpinBox与QDoubleSpinBox如何禁用上箭头或下箭头
环境:Qt版本5.15.2,编译器MinGW64-bit
第一步:准备好QSpinBox与QDoubleSpinBox的QSS样式表【可跳过】
可以写qss文件,也可以使用 setStyleSheet 字符串的形式,都可以
QSpinBox, QDoubleSpinBox
{
height: 24px;
width: 65px;
background: rgba(11, 12, 13, 1);
border: 1px solid rgba(47, 50, 55, 1);
color: white;
border-radius: 2px;
qproperty-alignment: AlignCenter;
selection-background-color: rgba(120,120,120,128);
selection-color: white;
font:normal normal 12px;
}
QSpinBox:hover, QDoubleSpinBox:hover
{
border: 1px solid rgba(120, 79, 56, 1);
}
QSpinBox:focus, QDoubleSpinBox:focus
{
border: 1px solid rgba(237, 129, 29, 1);
}
QSpinBox:disabled, QDoubleSpinBox:disabled
{
border: 1px solid rgba(47, 50, 55, 1);
color:#6A707C;
}
QSpinBox::up-button, QDoubleSpinBox::up-button, QSpinBox::down-button, QDoubleSpinBox::down-button
{
height: 12px;
width: 12px;
border: 0px;
background: rgba(28, 30, 33, 1);
}
QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover
{
background: rgba(42, 45, 50, 1);
}
QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed
{
background: rgba(56, 60, 66, 1);
}
QSpinBox::up-button:disabled, QDoubleSpinBox::up-button:disabled, QSpinBox::down-button:disabled, QDoubleSpinBox::down-button:disabled
{
background: rgba(28, 30, 33, 1);
}
/*此处注意,off属性很重要,对应的是控件内数值到达最大值时(upbutton不可用了),或最小值时(downbutton不可用了)*/
QSpinBox::up-button:off, QDoubleSpinBox::up-button:off, QSpinBox::down-button:off, QDoubleSpinBox::down-button:off
{
background: rgba(24, 26, 29, 1);
}
QSpinBox::up-arrow, QDoubleSpinBox::up-arrow
{
border:0px;
image:url(:/image/control/spinBox/normal/up.svg);
}
QSpinBox::up-arrow:hover, QDoubleSpinBox::up-arrow:hover
{
image:url(:/image/control/spinBox/hover/up.svg);
}
QSpinBox::up-arrow:pressed, QDoubleSpinBox::up-arrow:pressed
{
image:url(:/image/control/spinBox/down/up.svg);
}
QSpinBox::up-arrow:disabled, QDoubleSpinBox::up-arrow:disabled
{
image:url(:/image/control/spinBox/disable/up.svg);
}
/*此处注意,off属性很重要,对应的是控件内数值到达最大值时(uparrow不可用了),或最小值时(downarrow不可用了)*/
QSpinBox::up-arrow:off, QDoubleSpinBox::up-arrow:off
{
image:url(:/image/control/spinBox/disable/up.svg);
}
QSpinBox::down-arrow, QDoubleSpinBox::down-arrow
{
image:url(:/image/control/spinBox/normal/down.svg);
}
QSpinBox::down-arrow:hover, QDoubleSpinBox::down-arrow:hover
{
image:url(:/image/control/spinBox/hover/down.svg);
}
QSpinBox::down-arrow:pressed, QDoubleSpinBox::down-arrow:pressed
{
image:url(:/image/control/spinBox/down/down.svg);
}
QSpinBox::down-arrow:disabled, QDoubleSpinBox::down-arrow:disabled
{
image:url(:/image/control/spinBox/disable/down.svg);
}
QSpinBox::down-arrow:off, QDoubleSpinBox::down-arrow:off
{
image:url(:/image/control/spinBox/disable/down.svg);
}
以上是范例,图片需要自行添加
第二步:创建一个自定义样式类,用于重写样式
类放的位置自行定义,能用得到就行
#include <QProxyStyle>
class CCustomSpinBoxStyle : public QProxyStyle
{
public:
int styleHint(StyleHint stylehint, const QStyleOption *opt, const QWidget *widget, QStyleHintReturn *returnData) const
{
if(stylehint == QStyle::SH_SpinControls_DisableOnBounds)
{
return true;//当数据到达边界时,触发禁用,默认是返回的false,此处返回true
}
return QProxyStyle::styleHint(stylehint, opt, widget, returnData);
}
};
第三步:给自己的QSpinBox或QDoubleSpinbox设置样式
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
QSpinBox* pSpinbox = new QSpinBox(this);
//pSpinbox->setStySheet("这里放上你的样式表字符串,如果已经准备了QSS样式文件,此处可以不加"); /*可加可不加*/
pSpinbox->setRange(0,5);
CCustomSpinBoxStyle* pStyle = new CCustomSpinBoxStyle();/*这个地方将pStyle做成成员变量,然后在析构函数里释放*/
pSpinbox->setStyle(pStyle);
}
第四步:检查成果
当数值是
p
S
p
i
n
b
o
x
的下限时,下方的按钮被禁用了
当数值是pSpinbox的下限时,下方的按钮被禁用了
当数值是pSpinbox的下限时,下方的按钮被禁用了
当数值是
p
S
p
i
n
b
o
x
的上限时,上方的按钮被禁用了
当数值是pSpinbox的上限时,上方的按钮被禁用了
当数值是pSpinbox的上限时,上方的按钮被禁用了