C++ qcombobox的下拉箭头无边框
时间: 2023-11-14 12:39:18 浏览: 101
要去掉QComboBox的下拉箭头的边框,可以使用QProxyStyle类来自定义QStyle。具体来说,需要重写drawPrimitive函数并在其中绘制无边框的箭头。
以下是一个简单的例子:
```c++
#include <QApplication>
#include <QComboBox>
#include <QProxyStyle>
#include <QStyleOptionComboBox>
class MyStyle : public QProxyStyle
{
public:
void drawPrimitive(PrimitiveElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = nullptr) const override
{
if (element == PE_IndicatorArrowDown && qobject_cast<const QStyleOptionComboBox*>(option))
{
QStyleOptionComboBox opt(*qstyleoption_cast<const QStyleOptionComboBox*>(option));
// 去掉箭头的边框
opt.subControls &= ~QStyle::SC_ComboBoxArrow;
// 绘制无边框箭头
painter->save();
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(Qt::NoPen);
painter->setBrush(option->state & State_Enabled ? option->palette.buttonText() : option->palette.button().color().lighter(110));
painter->drawPolygon(QPolygonF({QPointF(0, 0), QPointF(10, 0), QPointF(5, 8)}));
painter->restore();
QProxyStyle::drawPrimitive(element, &opt, painter, widget);
}
else
{
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 创建一个QComboBox并将自定义样式设置为其样式
QComboBox comboBox;
comboBox.addItems({"Option 1", "Option 2", "Option 3"});
comboBox.setStyle(new MyStyle);
comboBox.show();
return a.exec();
}
```
在这个例子中,我们创建了一个名为MyStyle的自定义样式类,并重写了drawPrimitive函数。在这个函数中,我们首先检查绘制的元素是否是下拉箭头,并检查选项是否是QStyleOptionComboBox。然后,我们重置选项的subControls字段,以便去掉箭头的边框。最后,我们绘制了一个无边框箭头,并继续调用基类的drawPrimitive函数以绘制其他元素。
请注意,这只是一个简单的例子,可以根据需要进行修改和定制。
阅读全文