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

Qt 对齐QComboBox中的文本而不使其可编辑?,qt,Qt,我有一个QComboBox,看起来像: 在网上,您会看到许多人在QComboBox上发布代码,将标签置于中心位置,看起来像: auto cmb = new QComboBox(parent); cmb->setEditable(true); cmb->lineEdit()->setReadOnly(true); cmb->lineEdit()->setAlignment(Qt::AlignCenter); 这不起作用,因为它改变了小部件的行为,要求用户使

我有一个
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;"
                        "}"
                        );

通过这样做,并通过设置组合框的最小宽度,使所有项目在下拉列表可见时也居中,我能够实现居中外观。您可能需要调整剩余填充量以获得所需的外观。

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

您是否尝试过使用类似于
qApp->setStyleSheet(“QComboBox{text align:center;}”)
的Qt样式表。可能它不是文本对齐。此外,您还可以检查是否需要在QCombobox内设置QLineEdit的样式。@johngull QLineEdit对象仅在您将其设置为“可编辑”模式时才存在。这就是我想要避免的。嘿,看看github中的最新源代码,代码似乎已经更改,不再是硬编码的,这意味着我们现在可以更改对齐方式了吗?(文档没有更改,也没有提及)不幸的是,此代码尚未包含在Qt 5.15.1代码中。。所以希望在下一个版本中这是可能的