1

我正在尝试使用 aQLinearGradient来绘制 a 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();
}

关于我做错了什么的任何想法?

4

2 回答 2

1

没有成功,我尝试使用 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(...)为渐变设置不同的颜色和点。

希望这对您有所帮助,请原谅我之前的愚蠢评论)

于 2019-01-22T11:11:31.903 回答
1

您的渐变配置为 from <0, 0>to <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)。这取决于您是否需要对画笔进行进一步控制,例如“显示渐变,但仅在达到特定宽度之前”。此外,考虑到样式表通常与其他QStyles 冲突(如果使用)。

于 2019-01-22T11:13:36.117 回答