Skip to content

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);
    }
}