如何用Qt QPainter绘制线性渐变圆弧?

2023-11-24

我正在尝试开发自定义QProgressBar如下图所示:

enter image description here

我创建了一个扩展 QProgressBar 的类并实现了 PaintEvent() :

void CircularProgressBar::paintEvent(QPaintEvent*) {

int progress = this->value();
int progressInDegrees = (double)(progress*360)/100;

int barWidth = 20;

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);

painter.setPen(QPen(Qt::black, barWidth, Qt::SolidLine,Qt::RoundCap));

painter.drawArc(barWidth/2, barWidth/2, this->width() - barWidth, this->height() - barWidth,
                90*16, progressInDegrees*-16);}

这对于绘制圆形进度条非常有效,但我在处理进度条的线性渐变颜色时遇到了麻烦。我尝试创建一个QPen with a QLinearGradient对象,我尝试设置QPainter刷到一个QLinearGradient反对,但这两种策略都不起作用。是否可以绘制圆弧QPainter具有线性渐变颜色?


我知道这是一个老问题,但几天前我遇到了它,我想我有一个解决方案。您想要的是创建一个圆锥形渐变并剪辑要用作圆形加载栏的磁盘。这是一个例子:

小部件.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QPaintEvent;

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void setLoadingAngle(int loadingAngle);
    int loadingAngle() const;

    void setDiscWidth(int width);
    int discWidth() const;

protected:
    void paintEvent(QPaintEvent *);

private:
    int m_loadingAngle;
    int m_width;
};

#endif // WIDGET_H

小部件.cpp:

#include "widget.h"

#include <QPaintEvent>
#include <QPainter>
#include <QConicalGradient>
#include <QPen>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    m_loadingAngle(0),
    m_width(0)
{
}

Widget::~Widget()
{
}

void Widget::setLoadingAngle(int loadingAngle)
{
    m_loadingAngle = loadingAngle;
}

int Widget::loadingAngle() const
{
    return m_loadingAngle;
}

void Widget::setDiscWidth(int width)
{
    m_width = width;
}

int Widget::discWidth() const
{
    return m_width;
}

void Widget::paintEvent(QPaintEvent *)
{
    QRect drawingRect;
    drawingRect.setX(rect().x() + m_width);
    drawingRect.setY(rect().y() + m_width);
    drawingRect.setWidth(rect().width() - m_width * 2);
    drawingRect.setHeight(rect().height() - m_width * 2);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    QConicalGradient gradient;
    gradient.setCenter(drawingRect.center());
    gradient.setAngle(90);
    gradient.setColorAt(0, QColor(178, 255, 246));
    gradient.setColorAt(1, QColor(5, 44, 50));

    int arcLengthApproximation = m_width + m_width / 3;
    QPen pen(QBrush(gradient), m_width);
    pen.setCapStyle(Qt::RoundCap);
    painter.setPen(pen);
    painter.drawArc(drawingRect, 90 * 16 - arcLengthApproximation, -m_loadingAngle * 16);
}

主要.cpp:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.setDiscWidth(20);
    w.setLoadingAngle(270);
    w.show();

    return a.exec();
}

结果是:

enter image description here

当然,这不是完整且准确的解决方案,但我认为这是您实现您想要的目标所需了解的一切。其余的都是不难实施的细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用Qt QPainter绘制线性渐变圆弧? 的相关文章

  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • QStyledItemDelegate 绘制自定义小部件失败

    在我的一个项目中 我使用的是QTableWidget为了显示一些复杂的计算结果 为了提高表格的可读性 我需要在单个表格单元格内显示两个对齐的值 后来我想通过使用颜色或箭头等来进一步自定义小部件 为此我源自QStyledItemDelegat
  • 如何让小部件在上下文菜单出现时接收鼠标释放事件

    在Ubuntu20 04上 当上下文菜单出现时 我无法让小部件接收鼠标释放事件 而Windows可以接收 我的pyqt版本是5 15 2 我考虑过手动发送鼠标释放事件 但我不知道当上下文菜单出现时哪些系统会收到鼠标释放事件 这样做可能会导致
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • PyQt4 QPalette 不工作

    btn QtGui QPushButton Button self palettes btn palette palettes setColor btn backgroundRole QtCore Qt green btn setPalet
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • QAbstractItemModel 如何表示树?

    我仍然很难理解 QAbstractItemModel 对项目的表示 有两种返回 QModelIndex 项的方法对我来说没有任何意义 QModelIndex QAbstractItemModel index int row int colu
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se

随机推荐

  • 在跨平台应用程序中使用 snprintf

    我正在编写一个 C 程序 预计可以使用所有主要编译器进行编译 目前我正在 Linux 机器上的 GCC 上进行开发 并在提交代码之前在 MSVC 上进行编译 为了使交叉编译变得容易 我正在编译 ansi and pedantic旗帜 这很有
  • ASP.NET Identity(使用IdentityServer4)获取外部资源oauth访问令牌

    我已经阅读了 IdentityServer4 的文档 并将其设置为使用 Microsoft Office 365 作为登录提供程序 当用户登录后 我想创建一个按钮 他可以在其中允许我的应用程序使用 graph microsoft com 的
  • 以编程方式获取代码的 Big-O 效率

    我想知道是否有任何自动方法可以 至少粗略地 确定给定函数的 Big O 时间复杂度 如果我绘制 O n 函数与 O n lg n 函数的图表 我想我将能够直观地确定哪个是哪个 我认为必须有一些启发式解决方案可以自动完成此操作 有任何想法吗
  • “import foo.*”不应该包含子包“foo.bar.*”吗?

    在学习 Java 时 我想到了许多教程中相当令人困惑的属性 考虑示例教程中的以下两个导入 import java awt import java awt event 第一行显然导入了 java awt 包 第二行导入了 awt 的子包 但是
  • mongoose.connection() 和 mongoose.createConnection() 之间的混淆

    我已经研究了 mongoose 三天 对这两种方法的使用有点困惑 我知道 mongoose connection 将来会被弃用 问题是 当我尝试转换 从 mongoose connection 到 mongoose createConnec
  • GCDAsyncUdpSocket 与组播发送和接收

    在第一种方法中 我创建客户端 服务器应用程序 基于样本项目 将一些数据发送到服务器 Legend sender address reciver ip port reciver port reciver address null since
  • 具有不可编辑/不可取消后缀的 EditText [重复]

    这个问题在这里已经有答案了 我为我的一项活动创建了一个布局 用户可以在其中的某些 EditText 小部件中插入值 我需要其中一些 EditText 必须具有不可编辑的后缀 如 cm mm 等 用户插入值后 我将解析这些 EditText
  • JavaScript 在 ul 中查找 li 索引

    我正在尝试通过 Javascript 中的 id 查找列表项的索引 例如 我有 5 个项目的列表 给定一个元素 我想找出它在列表中的位置 下面是我希望构建的代码 它使用 onclick 处理程序来查找正在工作的元素 然后我只需要以某种方式找
  • Sequelize targetKey 不起作用

    我正在尝试使用sequelize关联两个模型 Note 和 Resource 但是 targetKey 没有按预期工作 注意模态 module exports function sequelize DataTypes return sequ
  • 解构深层属性

    我最近开始使用 ES6解构赋值语法并开始熟悉这个概念 我想知道是否可以使用相同的语法提取嵌套属性 例如 假设我有以下代码 let cagingIt foo bar Nick Cage 我知道我能够访问摘录foo通过执行以下操作将其放入变量中
  • 使用 API 的 Ionic 3 登录身份验证 - 无法读取 null 的属性“json”

    我正在使用 API 在 Ionic 3 中进行身份验证 但在登录过程中 它显示错误 无法读取 null 的属性 json 这是我的providers gt restapi gt restapi ts import HttpClient fr
  • 客户端发送的请求语法错误 ().+Spring , RESTClient

    我正在使用 JSON 对象使用 Spring MVC 当我尝试从 RESTClient 发送 JSON 对象时 我得到 HTTP 状态 400 客户端发送的请求在语法上不正确 这是我的控制器 ObjectMapper mapper new
  • .net core (csproj) global.json 'projects' 等效项

    使用 net core project json 我曾经通过将源代码的路径添加到 nuget 包和源代码之间进行切换projectsglobal json 中的字段 完成此操作后 它将添加它可以在该路径中找到的所有项目 这些项目可以替换我引
  • 使用 Delaunay 三角剖分进行插值

    有一个形状像某种扭曲抛物面的浊点 我想使用 Delaunay 三角剖分来插值这些点 我尝试过其他技术 例如样条线 但没有设法强制执行所需的行为 我想知道是否有一种快速的方法来使用结果scipy spatial Delaunay我可以给出 x
  • “初始化 Java 工具”期间发生内部错误。在 Eclipse 启动时

    我在启动时遇到这个奇怪的错误 我的环境可能出了什么问题 这是错误 gt ENTRY org eclipse core jobs 4 2 2010 12 30 17 56 32 545 MESSAGE An internal error oc
  • 当出现平局时,熊猫如何决定排序顺序?

    熊猫0 12 0 例如 在下面的 DataFrame 中 为什么它会混淆索引 看一下 4 索引从 1 15 6 7 开始 pandas 用于决定如何排序的推理是什么 我怀疑索引会保持顺序以获得相等的值 mydf pd DataFrame n
  • 修复了 g++ 4.9.1 中奇怪的“%a”格式行为?

    编译器 来自 Nuwen 发行版的 64 位 MinGW G 4 9 1 在 Windows 8 1 下 Code ifdef INCLUDE IOSTREAM include
  • 通过 xmlstarlet 中的文本值选择节点

    我正在尝试提取 Value 节点的值 其中 Key 节点是 bash shell 中的 state
  • 拦截(并可能拒绝)Web 套接字升级请求

    我有一个 Node js 服务器 我正在向其发送 Web 套接字升级请求 此请求的授权标头包含登录信息 我需要将其与数据库条目进行比较 我不确定如何阻止 Web 套接字连接打开 直到执行数据库查询回调之后 以下是我目前正在做的事情的简化 v
  • 如何用Qt QPainter绘制线性渐变圆弧?

    我正在尝试开发自定义QProgressBar如下图所示 我创建了一个扩展 QProgressBar 的类并实现了 PaintEvent void CircularProgressBar paintEvent QPaintEvent int