代码之家  ›  专栏  ›  技术社区  ›  apalomer

用qlineargradient涂qpushbutton

  •  1
  • apalomer  · 技术社区  · 6 年前

    我想用一个 QLinearGradient 画一幅画 QPushButton 没有成功。我找到了一些如何用纯色绘制的例子。但我一直未能找到颜色渐变的例子。而且,我的方法不起作用。

    下面是我的完整示例,其中纯色按钮起作用,线性渐变按钮不起作用:

    #include <QApplication>
    #include <QGridLayout>
    #include <QLinearGradient>
    #include <QPalette>
    #include <QPushButton>
    
    int main(int argc, char** argv)
    {
      QApplication app(argc, argv);
    
      // Create layout
      QGridLayout* layout = new QGridLayout;
    
      // Create first button
      QPushButton* button_1 = new QPushButton();
      layout->addWidget(button_1, 0, 0);
      QPalette palette_1 = button_1->palette();
      palette_1.setColor(QPalette::Button, Qt::red);
      button_1->setPalette(palette_1);
      button_1->update();
    
      // Create second button
      QPushButton* button_2 = new QPushButton();
      layout->addWidget(button_2, 0, 1);
      QLinearGradient gradient_button(0, 0, button_2->width(), 0);
      gradient_button.setColorAt(0, Qt::white);
      gradient_button.setColorAt(1, Qt::black);
      QPalette palette_2 = button_2->palette();
      QBrush brush(gradient_button);
      palette_2.setBrush(QPalette::Button, brush);
      button_2->setPalette(palette_2);
      button_2->update();
    
      // Create widget
      QWidget* widget = new QWidget;
      widget->setLayout(layout);
      widget->resize(300, 50);
    
      /// Show
      widget->show();
    
      // Run
      return app.exec();
    }
    

    对我做错了什么有什么看法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alexander Chernin    6 年前

    如果没有成功,我已经用qpalette进行了尝试,并成功地使用 setStyleSheet :

    QPushButton* button = new QPushButton();
    QString linearGradient = QString("qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));");
    
    button->setStyleSheet(QString("background-color: %1").arg(linearGradient));
    

    另外,我们可以使用 QString::arg(...) 为渐变设置不同的颜色和点。

    希望这能帮到你,原谅我之前的愚蠢评论)

        2
  •  1
  •   cbuchart    6 年前

    您的渐变配置为从 <0, 0> <button_2->width(), 0> 但是现在你创造了你的梯度 button_2 不包括在任何布局中:它的宽度将在父窗口小部件(因此按钮所在的布局)调整大小时计算。如果你尝试固定宽度,你会看到渐变效果如预期。

    QPushButton* button_2 = new QPushButton();
    button_2->setFixedWidth(100);
    

    您可以使用事件过滤器来观察调整大小并相应地调整渐变:

    class ButtonResizeWatcher : public QObject {
    protected:
      virtual bool eventFilter(QObject* o, QEvent* e) override {
        if (e->type() == QEvent::Resize) {
          auto button = qobject_cast<QPushButton*>(o);
    
          QLinearGradient gradient_button(0, 0, button->width(), 0);
          gradient_button.setColorAt(0, Qt::white);
          gradient_button.setColorAt(1, Qt::red);
    
          auto palette = button->palette();
          palette.setBrush(QPalette::Button, QBrush(gradient_button));
          button->setPalette(palette);
        }
    
        return QObject::eventFilter(o, e);
      }
    };
    

    用途:

    ButtonResizeWatcher resize_watcher;
    button_2->installEventFilter(&resize_watcher);
    

    完整代码可在 GitHub .

    另一种选择是使用样式表,正如在另一个答案中所评论的那样( qlineargradient )。它取决于您是否需要对画笔进行进一步的控制,例如“显示渐变,但仅限于达到特定宽度”。另外,考虑到样式表通常与其他样式表冲突 QStyle S(如果使用的话)。