似乎在QComboBox中设置字体样式会覆盖视图的字体样式(我认为不应该这样)。
但是,当我尝试显式地将视图设置给组合框时,使用以下方式:
view = new QListView()
myCombo->setView(view)
原帖中发布的样式表突然起作用了。
顺便说一下,新视图与原始视图不同(例如有白色背景等),我猜原作者对此不太满意。当然,可以继续进行样式设置,但更希望有一个准备好的视图,具有一致的样式。
检查默认的QComboBox
视图:
QComboBox * combo = new QComboBox();
qDebug() << combo->view();
产生以下结果:
QComboBoxListView(0x2091880)
因此,有一个特定的
QComboBoxListView
类,在文档中找不到,在
qcombobox_p.h 中定义,不能包括文件,但至少我们可以理解问题来自哪里,在
viewOptions
重写方法中:
QStyleOptionViewItem option = QListView::viewOptions();
option.showDecorationSelected = true;
if (combo)
option.font = combo->font(); // <
return option;
那个
combo
是一个私有指针,指向在构造函数中初始化的
QComboBox
:
QComboBoxListView(QComboBox *cmb = 0) : combo(cmb) {}
这将始终使用自己的字体覆盖视图选项字体。
让我们拷贝并重命名
QComboBoxListView
类:
comboitemview.h
#ifndef COMBOITEMVIEW_H
#define COMBOITEMVIEW_H
#include <QListView>
#include <QComboBox>
class ComboItemView : public QListView
{
Q_OBJECT
QComboBox * _box;
public:
ComboItemView(QComboBox *box);
protected:
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
QStyleOptionViewItem viewOptions() const;
};
#endif
comboitemview.cpp
#include "comboitemview.h"
#include <QPaintEvent>
#include <QPainter>
ComboItemView::ComboItemView(QComboBox * box = 0) : _box(box){}
void ComboItemView::paintEvent(QPaintEvent *event)
{
if (_box)
{
QStyleOptionComboBox opt;
opt.initFrom(_box);
opt.editable = _box->isEditable();
if (_box->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, _box))
{
QStyleOptionMenuItem menuOpt;
menuOpt.initFrom(this);
menuOpt.palette = palette();
menuOpt.state = QStyle::State_None;
menuOpt.checkType = QStyleOptionMenuItem::NotCheckable;
menuOpt.menuRect = event->rect();
menuOpt.maxIconWidth = 0;
menuOpt.tabWidth = 0;
QPainter p(viewport());
_box->style()->drawControl(QStyle::CE_MenuEmptyArea, &menuOpt, &p, this);
}
}
QListView::paintEvent(event);
}
void ComboItemView::resizeEvent(QResizeEvent *event)
{
resizeContents(viewport()->width(), contentsSize().height());
QListView::resizeEvent(event);
}
QStyleOptionViewItem ComboItemView::viewOptions() const
{
QStyleOptionViewItem option = QListView::viewOptions();
option.showDecorationSelected = true;
return option;
}
最后使用它来设定视图字体的样式:
myCombo->setView(new ComboItemView(myCombo));
myCombo->setStyleSheet(
"QComboBox {font-weight: bold;} "
"QComboBox QAbstractItemView {font-weight: normal;}"
);