【问题标题】:QPushButton rounded gradient border with QSS带有 QSS 的 QPushButton 圆形渐变边框
【发布时间】:2018-02-01 02:11:36
【问题描述】:

我正在尝试使用 Qt 使用 QSS 制作一些“复杂”的按钮样式,但我遇到了一个我无法解决的问题。

我想做一个渐变的圆角边框,比如从左边的蓝色变成右边的红色:

想要的结果

所以,这是应用于 QPushButton 的样式表:

background:
    white;
border-radius:
    30px;
border-style:
    solid;
border-width:
    10px;
border-color: 
    qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 blue, stop: 1 red)
    red
    qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 blue, stop: 1 red)
    blue;

这是结果。

很丑,对吧?

【问题讨论】:

  • 去掉半径后效果很好。似乎梯度是为边界的半径部分计算的,独立于边界本身。这个半径部分是每个边框的一半角。
  • 这就是重点,我需要一个半径;)

标签: css qt border gradient qtstylesheets


【解决方案1】:

此问题已作为错误报告给 Qt,但没有迹象表明他们会修复它:https://bugreports.qt.io/browse/QTBUG-2221

我能够通过在paint.net(您可以使用任何图像创建程序)上创建一个具有此确切边框的 .png 图像来解决此问题。我将背景设置为透明,并确保图像的边框是我想要的 QPushButton 上的边框。然后我将 .png 文件设置为资源并在 QPushButton 样式表中输入:

border: none;
border-image: url(:/icons/images/blue-red-gradient.png);
background-color: rgb(255, 255, 255);
border-radius: 15px;

这是我的 QMainWindow 上的最终结果:

您可以做的另一件事是继承 QPushButton 并覆盖它的绘制事件。在那里绘制你的边框并将你所有的 QPushButtons 提升到这个新类。不过这会更痛苦,所以我个人更喜欢我的第一个解决方案。

【讨论】:

    【解决方案2】:

    我搜索了一下,我看到了两种方法,但是第二种使用与边界半径不兼容的边界图像,所以你必须处理 :before 和 :after。

    只是为了链接你来自 camilo martin 的答案:

    查看答案here

    【讨论】:

    • 遗憾的是,Qt 样式表无法访问 ":after" 关键字。我可以有效地创建一个堆叠矩形和按钮的小部件,但在这种情况下,我将失去样式表的灵活性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2014-01-19
    相关资源
    最近更新 更多