C++ 从QComboBox的标签中隐藏图标
我正在尝试实现一个QComboBox,其中包含QIcon和QString,如下所示:C++ 从QComboBox的标签中隐藏图标,c++,qt,pyqt4,qcombobox,C++,Qt,Pyqt4,Qcombobox,我正在尝试实现一个QComboBox,其中包含QIcon和QString,如下所示: QComboBox.addItem(icon, label); 我希望图标在下拉列表中可见,但在工具栏中不可见。选择项目后,只有字符串应可见 有没有一种简单的方法可以做到这一点?最好的方法是设置一个代理并自己绘制项目。 然后,您可以选择何时或不绘制图标装饰角色,您可以选择不绘制作为当前索引的索引的图标。 我可以找到一个关于如何在combobox上使用委托的快速示例: 但恐怕这不是最简单的方法。 祝你好运 为
QComboBox.addItem(icon, label);
我希望图标在下拉列表中可见,但在工具栏中不可见。选择项目后,只有字符串应可见
有没有一种简单的方法可以做到这一点?最好的方法是设置一个代理并自己绘制项目。 然后,您可以选择何时或不绘制图标装饰角色,您可以选择不绘制作为当前索引的索引的图标。 我可以找到一个关于如何在combobox上使用委托的快速示例: 但恐怕这不是最简单的方法。
祝你好运 为了解决这个问题,覆盖paintEvent方法就足够了,从源代码获取默认实现。在绘制控件QStyle::CE_ComboxLabel之前,必须设置QSTYLEOPTIONCOMBOX.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);
}
}
};
简单但有点粗糙:重新实现showPopup和hidePopup,并根据需要添加/删除图标。@ekhumoro这可能不适用于我的场景,因为在这两种情况下,我都不希望图标在工具栏中可见。如果我在showPopup中实现,prev选择将在工具栏中显示图标,这不是我想要的。