【问题标题】:How to render a red push button using QStyle.drawControl()?如何使用 QStyle.drawControl() 渲染红色按钮?
【发布时间】:2012-08-07 17:14:57
【问题描述】:

通过以下代码,我尝试使用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。

【问题讨论】:

  • 您是否在此按钮上设置了一些文字?也许“Qt::red”正在落入文本颜色、背景/框架颜色
  • @Kamil Klimek:'QPalette::QPalette(Qt::GlobalColor button)' 状态的文档'从按钮颜色构造一个调色板。其他颜色会根据此颜色自动计算。窗口也将是按钮颜色';见qt-project.org/doc/qt-4.8/qpalette.html#QPalette-3
  • @Kamil Klimek:我还测试了其他几种构建调色板的方法,但似乎无论调色板是什么,按钮最终都具有相同的颜色。
  • 显式设置应用样式是否有效?也就是说,如果你调用 app.setStyle("windows");你会得到不同的结果吗?
  • @RA.:是的,它可以工作。正如 alexisdm 答案中的链接中所解释的,该问题特定于 Windows XP、Windows Vista 和 Mac 样式。

标签: c++ qt qt4 qstyle


【解决方案1】:

按钮由原生样式引擎绘制,因此可能根本不使用调色板(参见常见问题解答中的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));
    }
};

【讨论】:

    【解决方案2】:

    您正在尝试做的事情似乎过于复杂。如果你只想要一个红色按钮,为什么不使用 QPushButton 的setStyleSheet() 方法呢?它需要一个 QString,您可以定义类似于 CSS 的按钮。这里我为你创建了一个红色按钮,类似于 XP ui 按钮:

    QPushButton 
    { 
        background: qlineargradient(x1:0,y1:0,x2:0,y2:1, stop:0 #f4a3a3,stop: 1 #cc1212);
        border-width: 1px; 
        border-color: #d91414; 
        border-style: solid; 
        padding: 5px; 
        padding-left:10px; 
        padding-right:10px; 
        border-radius: 3px; 
        color:#000;
    }
    
    QPushButton:hover
    {
        border-color: #e36666;
    } 
    
    QPushButton:pressed 
    {
        background:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop: 0 #de8383, stop: 1 #ad0C0C); 
        border-color: #d91414;
    }
    

    现在您只需将上面的代码作为字符串传递给按钮的 setStyleSheet() 方法。如果你想创建一个按钮小部件,默认是红色的,然后扩展QPushButton类,创建一个包含上面内容的静态QString字段,并在构造函数中将按钮设置为样式表。

    样式表上更易于理解的示例: Stylesheet Examples

    【讨论】:

    • 我通过将 alexisdm 的答案与您的样式表结合起来解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多