如何确定该样式支持自定义控件元素

时间:2014-01-24 13:05:15

标签: qt

我实现了一个自定义小部件并引入了新的控件元素CE_MYShapedFrame。现在我的小部件不能使用标准样式,因为他们不了解CE_MYShapedFrame。我需要更改我的小部件以使用标准样式。

void MyWidget::paintEvent(QPainter* painter)
{
    if (this->style()->supports(CE_MYShapedFrame) {
        style->drawControl(CE_MYShapedFrame, &opt, painter);
    } else 
        style->drawControl(CE_ShapedFrame, &opt, painter);
    }
}

所以我的问题是: 有没有办法写if if(this-> style() - >支持(CE_MYShapedFrame)。

1 个答案:

答案 0 :(得分:1)

您知道标准Qt样式不支持此功能。但你的自定义风格会。所以,你可以简单地检查它是否是你的风格:

if (dynamic_cast<MyStyle>(style()) {
  style()->drawControl(CE_MYShapedFrame, &opt, painter);
} else {
  style()->drawControl(CE_ShapedFrame, &opt, painter);
}

如果您希望有多种样式可以支持它,您可以引入一个通用接口,并在运行时检查它的存在。

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QStyle>
#include <QStyleOption>
#include <QEventLoop>

class IClever {
public:
    virtual bool supports(QStyle::ControlElement) = 0;
    static IClever * cast(QStyle * style) {
        return dynamic_cast<IClever*>(style);
    }
};

class MyStyle : public QStyle, public IClever {
    bool supports(QStyle::ControlElement el) { }
    //...
};

enum { kCE_MYShapedFrame };
QStyle::ControlElement CE_MYShapedFrame() {
    return (QStyle::ControlElement)kCE_MYShapedFrame;
}

class MyWidget : public QWidget {
    void paintEvent(QPaintEvent*) {
        QStyleOption opt;
        opt.initFrom(this);
        QPainter painter(this);
        if (IClever::cast(style()) && IClever::cast(style())->supports(CE_MYShapedFrame())) {
            style()->drawControl(CE_MYShapedFrame(), &opt, &painter);
        } else {
            style()->drawControl(QStyle::CE_ShapedFrame, &opt, &painter);
        }
    }
};