对齐QComboBox中的文本而不使其可编辑?

时间:2017-01-06 02:00:34

标签: qt

我有QComboBox看起来像: enter image description here

在线,您会看到很多人发布代码,将QComboBox上的标签置于中心位置,如下所示:

 auto cmb = new QComboBox(parent);
 cmb->setEditable(true);
 cmb->lineEdit()->setReadOnly(true);
 cmb->lineEdit()->setAlignment(Qt::AlignCenter);

这不起作用,因为它改变了窗口小部件的行为,要求用户在窗口小部件的侧面使用微小的导航按钮: enter image description here

我尝试使用样式表属性,但似乎没有效果

{
             cmb->setProperty("text-align", "center");
             cmb->style()->unpolish(cmb);
             cmb->style()->polish(cmb);
             cmb->update();
}

有人知道如何将QComboBox置于中心而不将其设置为可编辑模式吗? C ++ / Python解决方案很好。

2 个答案:

答案 0 :(得分:1)

我查看了QComboBox的源代码,并使用每种样式定义的复杂控制机制对其进行了绘制。不幸的是(从Qt 5.12开始),文本标签的对齐方式被硬编码为左对齐,如以下代码所示:

RDOAppointmentItem.HTMLBody

我能够获得居中文本的唯一方法是通过如下方式调整样式表的padding-left值:

proxy()->drawItemText(p, editRect.adjusted(1, 0, -1, 0), 
                      visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter), 
                      cb->palette, cb->state & State_Enabled, cb->currentText);

通过执行此操作,并设置ComboBox的最小宽度,以便在下拉菜单可见时所有项目也都居中,从而能够实现居中外观。您可能需要调整左填充的量才能获得所需的外观。

答案 1 :(得分:0)

覆盖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;
}