隐藏QComboBox标签中的图标
Hide Icon from the label of QComboBox
我正在尝试实现 QComboBox
,其中包含 QIcon
和 QString
,如下所示:
QComboBox.addItem(icon, label);
我希望图标在下拉列表中可见,但在工具栏中不可见。选择项目后,只有字符串应该可见。
有没有简单的方法来做到这一点?
最好的办法是设置委托,自己画物品。
然后你可以选择何时绘制图标(decorationRole),你可以选择不为当前索引的索引绘制图标。
我可以找到一个关于如何在组合框上使用委托的快速示例:
http://programmingexamples.net/wiki/Qt/Delegates/ComboBoxDelegate
但恐怕这不是最简单的方法。
祝你好运!
要解决这个问题,只需覆盖 paintEvent 方法,从源代码中获取默认实现即可。在绘制控件QStyle::CE_ComboBoxLabel
之前,需要给QStyleOptionComboBox.currentIcon
设置一个无效值
如果组合框不可编辑,此方法效果很好,否则左侧有一个空的 space 用于绘制图标。查看源代码,我发现组合框更改了 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);
}
}
};
我正在尝试实现 QComboBox
,其中包含 QIcon
和 QString
,如下所示:
QComboBox.addItem(icon, label);
我希望图标在下拉列表中可见,但在工具栏中不可见。选择项目后,只有字符串应该可见。
有没有简单的方法来做到这一点?
最好的办法是设置委托,自己画物品。 然后你可以选择何时绘制图标(decorationRole),你可以选择不为当前索引的索引绘制图标。 我可以找到一个关于如何在组合框上使用委托的快速示例: http://programmingexamples.net/wiki/Qt/Delegates/ComboBoxDelegate
但恐怕这不是最简单的方法。 祝你好运!
要解决这个问题,只需覆盖 paintEvent 方法,从源代码中获取默认实现即可。在绘制控件QStyle::CE_ComboBoxLabel
之前,需要给QStyleOptionComboBox.currentIcon
如果组合框不可编辑,此方法效果很好,否则左侧有一个空的 space 用于绘制图标。查看源代码,我发现组合框更改了 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);
}
}
};