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

Mik*_*ail 5 qt

我有一个QComboBox看起来像: 在此输入图像描述

在网上,您会看到很多人发布代码将标签居中,QComboBox如下所示:

 auto cmb = new QComboBox(parent);
 cmb->setEditable(true);
 cmb->lineEdit()->setReadOnly(true);
 cmb->lineEdit()->setAlignment(Qt::AlignCenter);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它改变了小部件的行为,要求用户使用小部件侧面的微小导航按钮: 在此输入图像描述

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

{
             cmb->setProperty("text-align", "center");
             cmb->style()->unpolish(cmb);
             cmb->style()->polish(cmb);
             cmb->update();
}
Run Code Online (Sandbox Code Playgroud)

有人知道如何在QComboBox不将其设置为可编辑模式的情况下将其居中吗?C++/Python 解决方案很好。

Gen*_*gan 3

我查看了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);
Run Code Online (Sandbox Code Playgroud)

我能够获得居中文本外观的唯一方法是调整样式表的 padding-left 值,如下所示:

comboBox->setStyleSheet("QComboBox {"
                        "   padding-left: 20px;"
                        "}"
                        );
Run Code Online (Sandbox Code Playgroud)

通过这样做并设置组合框的最小宽度,以便当下拉列表可见时所有项目也居中,我能够实现居中的外观。您可能需要调整 padding-left 量才能获得您想要的外观。