QProxyStyle¶
QProxyStyle使用十分灵活,可以选择性的重写方法用来实现自定义外观。以模块化的方法进行样式定制,不会影响到程序其他部分。对于表格定制使用StyledItemDelegate。
1 适用情况¶
- 只修改特定样式,不想重写整个print
- 不同分辨率显示器的边界不同,需要动态调整
2 用法¶
eg. 隐藏菜单栏图标
class NoIconStyle : public QProxyStyle {
public:
QSize sizeFromContents(
ContentsType type, const QStyleOption* option,
const QSize& size, const QWidget* widget) const override;
void drawControl(
ControlElement element, const QStyleOption* option,
QPainter* painter, const QWidget* widget) const override;
};
QSize NoIconStyle::sizeFromContents(
ContentsType type, const QStyleOption* option,
const QSize& size, const QWidget* widget) const
{
QSize newSize = QProxyStyle::sizeFromContents(type, option, size, widget);
if (type == CT_MenuItem) {
const QStyleOptionMenuItem* menuItemOption = qstyleoption_cast<const QStyleOptionMenuItem *>(option);
if (menuItemOption && (menuItemOption->menuItemType == QStyleOptionMenuItem::Normal)) {
int iconSize = 24;
newSize.setWidth(newSize.width() - iconSize);
}
}
return newSize;
}
void NoIconStyle::drawControl(
ControlElement element, const QStyleOption* option,
QPainter* painter, const QWidget* widget) const
{
if (element == CE_MenuItem) {
QStyleOptionMenuItem myOption(*qstyleoption_cast<const QStyleOptionMenuItem *>(option));
myOption.icon = QIcon();
int iconSize = 24;
myOption.rect.adjust(-iconSize, 0, 0, 0);
QProxyStyle::drawControl(element, &myOption, painter, widget);
} else {
QProxyStyle::drawControl(element, option, painter, widget);
}
}