【问题标题】:How to change the font of the qcombobox label/header only?如何仅更改 qcombobox 标签/标题的字体?
【发布时间】:2016-10-17 15:11:59
【问题描述】:

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

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

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

【问题讨论】:

  • 通过检索 currentData-fontRole 并将字体应用于画家,我已经能够在绘画功能中实现我想要的。虽然它需要复制/粘贴 QComboBox 绘制代码以在子类中对其进行修改...如果有人有更简洁的方法来解决我的问题,请告诉我!
  • 不知道我是否理解这个问题,但你为什么不能使用 CSS doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox
  • @agilob 我希望组合框的标签部分显示与所选项目相同的样式,因此取决于项目。该项目的样式由代码定义,我看不到任何使用 CSS 将其传播到 cbb-label 的方法。

标签: qt qcombobox


【解决方案1】:

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

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

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

combobox->setView(listview);

【讨论】:

  • 我的问题是我在列表视图中有不同的字体,而默认字体处理得很好。我只想将所选项目字体应用于组合框标签部分,这将是标签视图对象的更改而不是列表视图对象(但它在 QComboBox 类之外无法访问)。
  • 哦,是的,对不起,我误解了你的问题。您可以使用 QComboBox 信号 'currentIndexChanged(int index)',将其与自定义插槽连接,在该插槽中,您使用所选项目的索引(作为参数传递)通过函数 'itemData(...)' 和将字体应用到 QComboBox,使下拉菜单字体保持不变,但组合框标签字体根据所选项目更改
  • 正如我在问题中所说,我尝试了这个,但它不起作用,因为列表视图(组合框的子项)使用应用于所有项目的 QComboBox 的字体。
【解决方案2】:

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

你说的QComboBox标签实际上是QLineEdit,所以你只需要设置这个组件的字体,它就会解决你的问题。

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

【讨论】:

  • 聪明,但正如doc 所说的那样只有可编辑的组合框才有行编辑。。那么你的解决方案会导致一个简单的 QComboBox 崩溃。
  • if (box->lineEdit()) 将保证您的代码不会崩溃。
  • 但这也行不通……所以这不是解决方案。
  • 是的,你是对的。但另一种方法可能会奏效。如果你让列表中的第一项占据标签的位置,那么它看起来就像你想要的结果。
【解决方案3】:

适用于不可编辑的 QComboBox 的方法是安装一个 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();
}

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2019-09-10
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多