如何只更改qcombobox标签/标题的字体?

时间:2016-10-17 15:11:59

标签: qt qcombobox

当我更改我的QComboBox comboBox->setFont(whateverQFont);的字体时,它也会应用在下拉菜单中(所有项目),它会覆盖我在{{1}项目上设置的Qt :: FontRole数据}}

我只想在QComboBox标签上设置一个字体,并按原样显示下拉列表。甚至更好:直接使用与所选项目相同的字体 有没有一种简单的方法可以做到这一点?

编辑 Jasonhan 的解决方案适用于可编辑的QComboBox( - >设置QLineEdit上的字体),但不适用于常规QComboBox,因为QLabel是私人的。

3 个答案:

答案 0 :(得分:0)

在开始实现自定义模型之前,您可以尝试使用QListView。 它只适用于下拉菜单,您可以使用通常的 setFont 功能更改其字体;你必须将它应用于你的QComboBox例程 setView

这样的事情(它不是Qt C ++代码,我已经跳过函数调用中的所有参数):

QComboBox *combobox = new QComboBox();
combobox->setFont();
...
QListView *listview = new QListView();
listview->setFont();

combobox->setView(listview);

答案 1 :(得分:0)

两年后,我看到了这个问题。我不知道您是否找到了更好的方法。如果没有,那么以下代码可能会给您提示。

如您所说的

QComboBox标签实际上是QLineEdit,因此您只需要设置此组件的字体即可解决问题。

QComboBox *box = new QComboBox();
//add some list items to box
if (box->lineEdit())
    box->lineEdit()->setFont(font);//font is your desirable font

答案 2 :(得分:0)

对不可编辑的QComboBox起作用的方法是安装QProxyStyle,该QProxyStyle在绘制CE_ComboBoxLabel控件元素时设置字体。

下面是将标签字体设置为斜体的示例:

#include <QApplication>
#include <QProxyStyle>
#include <QPainter>
#include <QComboBox>

class MyProxyStyle : public QProxyStyle
{
public:
    void drawControl(QStyle::ControlElement element, const QStyleOption *option,
                     QPainter *painter, const QWidget *widget = nullptr) const override
    {
        if (element == QStyle::CE_ComboBoxLabel)
        {
            auto fnt = painter->font();
            fnt.setItalic(true);
            painter->setFont(fnt);
        }
        QProxyStyle::drawControl(element, option, painter, widget);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    app.setStyle(new MyProxyStyle);

    QComboBox cb;
    cb.addItem("Option 1");
    cb.addItem("Option 2");
    cb.addItem("Option 3");
    cb.show();

    app.exec();
}