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

Qt 如何仅更改qcombobox标签/标题的字体?,qt,qcombobox,Qt,Qcombobox,当我更改QComboBoxcomboBox->setFont(whateverQFont)的字体时它也应用于下拉菜单(所有项目),它覆盖了我用comboBox->setItemData(索引、itemSpecificFont、Qt::FontRole)在我的项目上设置的Qt::FontRole数据 我只想在QComboBox标签上设置字体,让下拉列表保持原样显示。或者更好:直接使用与所选项目相同的字体。 有没有一个简单的方法 编辑:Jasonhan的解决方案适用于可编辑的QComboBox(->

当我更改QComboBox
comboBox->setFont(whateverQFont)的字体时它也应用于下拉菜单(所有项目),它覆盖了我用
comboBox->setItemData(索引、itemSpecificFont、Qt::FontRole)在我的项目上设置的Qt::FontRole数据

我只想在QComboBox标签上设置字体,让下拉列表保持原样显示。或者更好:直接使用与所选项目相同的字体。
有没有一个简单的方法


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

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

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


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

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


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

QComboBox
标签正如您所说,实际上是一个
QLineEdit
,因此您只需设置此组件的字体,它就能解决您的问题

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

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

QComboBox
标签正如您所说,实际上是一个
QLineEdit
,因此您只需设置此组件的字体,它就能解决您的问题

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

对于不可编辑的QComboxBox,需要安装一个QProxyStyle,在绘制CE_ComboxLabel控件元素时设置字体

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

#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();
}
#包括
#包括
#包括
#包括
类MyProxyStyle:公共QProxyStyle
{
公众:
void drawControl(QStyle::ControlElement元素,常量QStyleOption*选项,
QPainter*painter,const QWidget*widget=nullptr)const覆盖
{
if(元素==QStyle::CE_ComboBoxLabel)
{
自动fnt=画师->字体();
fnt.setItalic(真);
画师->设置字体(fnt);
}
QProxyStyle::drawControl(元素、选项、画师、小部件);
}
};
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
应用程序设置样式(新MyProxyStyle);
QCOMBOX cb;
cb.补充条款(“选项1”);
cb.补充条款(“选项2”);
cb.补充条款(“选项3”);
cb.show();
app.exec();
}

对于不可编辑的QComboxBox有效的方法是安装一个QProxyStyle,在绘制CE_ComboxLabel控件元素时设置字体

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

#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();
}
#包括
#包括
#包括
#包括
类MyProxyStyle:公共QProxyStyle
{
公众:
void drawControl(QStyle::ControlElement元素,常量QStyleOption*选项,
QPainter*painter,const QWidget*widget=nullptr)const覆盖
{
if(元素==QStyle::CE_ComboBoxLabel)
{
自动fnt=画师->字体();
fnt.setItalic(真);
画师->设置字体(fnt);
}
QProxyStyle::drawControl(元素、选项、画师、小部件);
}
};
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
应用程序设置样式(新MyProxyStyle);
QCOMBOX cb;
cb.补充条款(“选项1”);
cb.补充条款(“选项2”);
cb.补充条款(“选项3”);
cb.show();
app.exec();
}

通过检索currentData fontRole并将字体应用于画师,我已经能够在绘制功能中实现我想要的功能。虽然它需要复制/粘贴QComboBox绘制代码以在子类中修改它。。。如果有人有一个更干净和简单的方法来解决我的问题,让我知道!不确定我是否理解这个问题,但为什么不能使用CSS?@agilob我希望组合框的标签部分显示与所选项目相同的样式,因此它取决于项目。项目是样式是由代码定义的,我看不到任何使用CSS将其传播到cbb标签的方法。通过检索currentData fontRole并将字体应用到画师,我已经能够在绘制功能中实现我想要的效果。虽然它需要复制/粘贴QComboBox绘制代码以在子类中修改它。。。如果有人有一个更干净和简单的方法来解决我的问题,让我知道!不确定我是否理解这个问题,但为什么不能使用CSS?@agilob我希望组合框的标签部分显示与所选项目相同的样式,因此它取决于项目。项目样式是由代码定义的,我看不到任何使用CSS将其传播到cbb标签的方法。我的问题是我在listview中有不同的字体,默认的字体处理得很好。我只想将所选项目字体应用于组合框标签部分,这将更多地改变标签视图对象而不是listview对象(但在QComboBox类之外无法访问)。哦,是的,对不起,我误解了你的问题。您可以使用QComboBox信号“currentIndexChanged(int index)”,将其与自定义插槽连接,在自定义插槽中使用所选项目的索引(作为参数传递)通过函数“itemData(…)”和“将字体应用于QComboBox”检索字体信息,因此,下拉菜单字体保持不变,但组合框标签字体会根据所选项目进行更改。正如我在问题中所说,我尝试了这个方法