我有一个
QComboBox
看起来像:
在网上你会看到很多人发布代码将标签置于
QComboBox
的中心,如下所示:
auto cmb = new QComboBox(parent);
cmb->setEditable(true);
cmb->lineEdit()->setReadOnly(true);
cmb->lineEdit()->setAlignment(Qt::AlignCenter);
这不起作用,因为它改变了小部件的行为,要求用户使用小部件侧面的微小导航按钮:
我尝试使用样式表属性,但似乎没有效果
{
cmb->setProperty("text-align", "center");
cmb->style()->unpolish(cmb);
cmb->style()->polish(cmb);
cmb->update();
}
有人知道如何将
QComboBox
居中而不将其设置为可编辑模式吗?
C++/Python 解决方案很好。
我查看了QComboBox的源代码,它是使用每种样式定义的复杂控制机制来绘制的。不幸的是(从 Qt 5.12 开始)文本标签的对齐方式被硬编码为左对齐,如以下代码所示:
proxy()->drawItemText(p, editRect.adjusted(1, 0, -1, 0),
visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
cb->palette, cb->state & State_Enabled, cb->currentText);
我能够获得居中文本外观的唯一方法是调整样式表的 padding-left 值,如下所示:
comboBox->setStyleSheet("QComboBox {"
" padding-left: 20px;"
"}"
);
通过这样做并设置组合框的最小宽度,以便当下拉列表可见时所有项目也居中,我能够实现居中的外观。您可能需要调整 padding-left 量才能获得您想要的外观。
重写paintEvent,复制qt源码,除了:
painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
这是为了防止绘制文本。
并绘制文字:
QPainter painter2(this);
QStyleOptionButton buttonOpt;
buttonOpt.initFrom(this); // init states, such as hover, disable
QRect editRect = this->style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this);
buttonOpt.rect = editRect; // text rect
buttonOpt.text = opt.currentText;
this->style()->drawControl(QStyle::CE_PushButtonLabel, &buttonOpt, &painter2, this); // as button text
现在,您可以在 qss 中对齐文本:
QComboBox{
text-align: center;
}