我实现了一个自定义小部件并引入了新的控件元素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)。
答案 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);
}
}
};