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