如何将QComboBox中的图标移到文本上方

4

我已经看了一段时间的QComboBox源码,但是我不知道需要改变什么才能使图标在QComboBox中显示在文本上方。

|-----------------------|
|         -----         |
|         |icn|         |
|         -----         |
|    Text label here    |
-------------------------

QCombobox中的绘制方法非常简单,它引用了一个叫做QStyleOptionComboBox的东西,但我认为我不想在这里进行更改,因为这会影响可移植性。

我是否最好发明一些新的东西来充当和表现得像QComboBox?

我应该补充说,我正在考虑同时更改ListView和选定的项,即按钮部分。

1个回答

4
为了处理组合框下拉视图中图标(装饰)的位置,您需要重写其视图选项QAbstractItemView::viewOptions()。我们来创建一个自定义视图,并用我们自己的视图替换原生组合框视图:
class ComboView : public QListView
{
protected:
    QStyleOptionViewItem viewOptions() const
    {
        // Set icon on the top and center of combo box item.
        QStyleOptionViewItem option = QListView::viewOptions();
        option.decorationAlignment = Qt::AlignHCenter | Qt::AlignCenter;
        option.decorationPosition = QStyleOptionViewItem::Top;
        option.displayAlignment = Qt::AlignCenter;   
        return option;
    }
};

对于组合框:

QComboBox cb;
cb.setView(new ComboView); // Sets the custom view.
cb.addItem(QIcon("icon.png"), "Item1");
cb.addItem(QIcon("icon.png"), "Item2");
cb.show();

哇,谢谢,这对下拉框的内容真的很好用,但是这不会影响所选项目吗?我可以假设相同的样式选项也可以应用于QComboBox的按钮部分吗? - aManFromOuterSpace
@aManFromOuterSpace,理论上是可以的,但我认为它不会像下拉视图那么容易。可编辑部分应该是一条编辑线,所以我不确定如何在不重写paint()事件等的情况下修改它。 - vahancho
我以为QCombobox由一个按钮和一个弹出窗口组成?我将继续研究如何像您描述的那样对齐按钮部分。 - aManFromOuterSpace
你好!能帮我一下吗?我需要隐藏该项的文本标签。这个可能吗? - Šerg
@Šerg,隐藏文本标签是什么意思?如果您将文本设置为空字符串,会发生什么? - vahancho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接