使用以下代码,我尝试使用 QStyle.drawControl()
渲染一个红色按钮:
#include <QtCore/QtCore>
#include <QtGui/QtGui>
class Widget : public QWidget
{
virtual void paintEvent(QPaintEvent* event)
{
QStyleOptionButton opt;
opt.palette = QPalette(Qt::red);
opt.state = QStyle::State_Active | QStyle::State_Enabled;
opt.rect = QRect(50, 25, 100, 50);
QPainter painter(this);
style()->drawControl(QStyle::CE_PushButton, &opt, &painter);
}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Widget w;
w.resize(200, 100);
w.show();
return app.exec();
}
但是我得到以下结果:
如何使用 QStyle.drawControl()
呈现红色按钮?
我在 Windows XP 上使用 Qt 4.8.1 和 Visal Studio 2010。
最佳答案
按钮由 native 样式引擎绘制,因此可能根本不会使用调色板(请参阅 FAQ 中的 that question)。
您可以使用带有样式表的实际按钮,该样式表作为最后一个参数传递给自己按钮的样式 drawControl
函数。
class Widget : public QWidget
{
// To allow the automatic deletion without parenting it
QScopedPointer<QPushButton> button;
public:
Widget() : button(new QPushButton) {
button->setStyleSheet("background-color: red");
}
virtual void paintEvent(QPaintEvent* event)
{
QStyleOptionButton opt;
opt.state = QStyle::State_Active | QStyle::State_Enabled;
opt.rect = QRect(50, 25, 100, 50);
QPainter painter(this);
button->style()->drawControl(QStyle::CE_PushButton, &opt, &painter,
button.data());
}
};
但是您会失去原生样式,因此您必须伪造它(bali182's answer 可能对那部分有用)。
或者你也可以使用同一个带有着色效果的按钮,调用它的render()
函数来绘制它:
class Widget : public QWidget {
QScopedPointer<QPushButton> button;
public:
Widget() : button(new QPushButton) {
QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect(button.data());
effect->setColor(Qt::red);
button->setGraphicsEffect(effect);
}
virtual void paintEvent(QPaintEvent* event) {
button->setFixedSize(100, 50);
button->render(this, QPoint(50, 25));
}
};
关于c++ - 如何使用 QStyle.drawControl() 呈现红色按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901037/