如何使用QStyle.drawControl()呈现红色按钮?

Joh*_*åde 4 c++ qt qt4 qstyle

使用以下代码我尝试使用以下方式呈现红色按钮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();
}
Run Code Online (Sandbox Code Playgroud)

但是我得到以下结果:

在此输入图像描述

如何使用红色按钮渲染QStyle.drawControl()

我在Windows XP上使用Qt 4.8.1和Visal Studio 2010.

ale*_*sdm 7

该按钮由本地的样式引擎绘制,所以调色板可能不会在所有(见使用这个问题从常见问题解答).

您可以使用带有样式表的实际按钮作为最后一个参数传递给自己按钮的样式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());
    }
};
Run Code Online (Sandbox Code Playgroud)

但是你会失去原生风格,所以你必须假装它(bali182的答案可能对那部分有用).

或者您可以使用具有着色效果的相同按钮并调用其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));
    }
};
Run Code Online (Sandbox Code Playgroud)