隐藏QComboBox标签中的图标

时间:2017-08-07 11:45:23

标签: c++ qt pyqt4 qcombobox

我正在尝试实施QComboBox,其中包含QIconQString,如下所示:

QComboBox.addItem(icon, label);

我希望图标在下拉列表中可见,但不在工具栏中。选择项目后,只有字符串可见。

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:1)

要解决此问题,只需从源代码中获取默认实现,就可以重写paintEvent方法。在绘制控件QStyle::CE_ComboBoxLabel之前,必须设置QStyleOptionComboBox.currentIcon

的无效值

如果组合框不可编辑,则此方法效果很好,否则,左侧将有一个空白空间用于绘制图标。查看源代码,我发现组合框更改了QLineEdit的几何形状。如果当前元素具有图标,则几何QLineEdit将向右移动。为了防止在同一paintEvent中发生这种情况,有必要在不考虑图标的情况下强制QLineEdit的几何形状。

以下代码考虑了这一点,并且在两种模式下均能正常工作:

class ComboBox : public QComboBox {
public:
    ComboBox(QWidget *parent = nullptr)
        : QComboBox(parent) {  }

protected:
    void paintEvent(QPaintEvent *) override {
        QStylePainter painter(this);
        painter.setPen(palette().color(QPalette::Text));

        // draw the combobox frame, focusrect and selected etc.
        QStyleOptionComboBox opt;
        initStyleOption(&opt);
        painter.drawComplexControl(QStyle::CC_ComboBox, opt);

        // draw the icon and text
        opt.currentIcon = QIcon();
        if (auto le = lineEdit()) {
            le->setGeometry(style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this));
        } else {
            painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
        }
    }
};

答案 1 :(得分:0)

最好的方法是设置一个委托并自己绘制项目。 然后你可以选择何时绘制图标(decorationRole),你可以选择不绘制当前索引的索引图标。 我可以找到一个关于如何在组合框上使用委托的快速示例: http://programmingexamples.net/wiki/Qt/Delegates/ComboBoxDelegate

但我担心这不是最简单的方法。 祝你好运!