QGraphicsLineItem::paint() 工件

2024-01-26

我有自己的类,它继承自QGraphicsLineItem并覆盖paint()绘制带箭头的粗线的方法:

void MyGraphicsItem::paint( QPainter* aPainter,
                            const QStyleOptionGraphicsItem* aOption,
                            QWidget* aWidget /*= nullptr*/ )
{
    Q_UNUSED( aOption );
    Q_UNUSED( aWidget );

    QLineF cLine = line();

    aPainter->setPen( QPen( Qt::black, 6, Qt::SolidLine ) );
    aPainter->drawLine( cLine );

    qreal lineAngle = cLine.angle();

    const qreal radius = 2.0;
    QLineF head1 = cLine;
    head1.setAngle(lineAngle+32);
    head1.setLength( 12 );
    QLineF head2 = cLine;
    head2.setAngle(lineAngle-32);
    head2.setLength( 12 );

    aPainter->drawLine( head1 );
    aPainter->drawLine( head2 );

    aPainter->setPen( QPen( Qt::yellow, 2, Qt::SolidLine ) );

    aPainter->drawLine( cLine );

    aPainter->drawLine( head1 );
    aPainter->drawLine( head2 );
}

当我在场景周围绘制项目时,这似乎会导致渲染伪影。据我所知,因为我已经设置了厚度QPen这让我相信我一定是在项目矩形之外绘制的?

是什么导致了我的渲染问题以及如何解决它?

请注意,图像中的背景没有被重新绘制 - 这也发生在场景中箭头被拖动的任何其他对象上。

编辑:我认为这实际上是我的问题:

子类化QGraphicsView并设置drawBackground https://stackoverflow.com/questions/10709694/subclassing-qgraphicsview-and-setting-drawbackground?rq=1

再次编辑:似乎绘制背景是问题所在,但使用全视图端口更新会降低性能,因此我想出了这个方法,它似乎将 CPU 使用率保持在 3%,而不是将一个核心固定为 100% 使用率。

// This code lives in the QGraphicsScene constructor, doesn't have to be there though since QGraphicsScene::setBackgroundBrush is public.
int gridSizeX = 25;
int gridSizeY = 20;
QImage singleGrid( gridSizeX, gridSizeY, QImage::Format_RGB32 );
singleGrid.fill( Qt::white );
{
    QPainter painter( &singleGrid );

    // Lighter background
    painter.setPen( QPen( QColor( 240, 240, 240 ) ));

    qreal midx = gridSizeX / 2;
    qreal midy = gridSizeY / 2;
    painter.drawLine( 0, midy, gridSizeX, midy );
    painter.drawLine( midx, 0, midx, gridSizeY );

    // Darker foregound
    painter.setPen( QPen( QColor( 180, 180, 180 ) ));
    painter.drawRect( 0, 0, gridSizeX, gridSizeY );

    painter.end();
}
QBrush brushBackground( singleGrid );
setBackgroundBrush( brushBackground );

然后场景在各处重复此画笔,产生相同的网格背景效果,甚至在缩放/缩放时按预期工作。 :)。


当您重写paint()函数时,您还需要在类中重写QGraphicsItem::boundingRect()来定义自定义图形项的外部边界。如果你在边界之外绘制,你最终会得到渲染伪影。现在你依赖于QGraphicsLineItem的boundingRect()实现,它当然不知道你的paint()函数的实现。看http://doc.qt.digia.com/main-snapshot/qgraphicsitem.html#boundingRect http://doc.qt.digia.com/main-snapshot/qgraphicsitem.html#boundingRect了解详情。

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

QGraphicsLineItem::paint() 工件 的相关文章

  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • Python 发行版有哪些用例?

    我正在为我正在编写的 Python 包开发一个发行版 以便我可以发布 它在 PyPI 上 这是我第一次使用 distutils setuptools distribute pip setup py 等等 我在学习曲线上有点挣扎 这比我预期的
  • 将 php 表单中的发件人电子邮件地址更改为收件人

    我正在尝试创建一个简单的 php 电子邮件表单 将提交的内容发送到指定的地址 但我试图解决的问题是电子邮件发送的地址 目前 它发送自 电子邮件受保护 cdn cgi l email protection 但我希望能够将其更改为简单的 电子邮
  • 为什么 GETDATE() 是无效标识符

    当我调试此代码时 为什么 Oracle Sql Developer 工具显示 GETDATE 是无效标识符 CREATE OR REPLACE TRIGGER SPName AFTER UPDATE ON TableName FOR EAC
  • Firebase querySnapshot 未根据 where 条件实时更新

    我使用带有 flutter 的 cloud firestore 来存储聊天内容 并使用 where 条件来获取聊天内容 文档正确返回 但添加新数据时聊天列表不会实时更新 聊天记录如何存储 collection gt message mess
  • 无法导入数据类模块

    今天我从 apt get 安装了 python 3 7 来尝试新的 dataclasses 模块 我单独安装了它 因为 python3 6 无法升级到 3 7 当我输入 python3 7 version 它给了我 gt gt gt Pyt
  • 代理和 fetchMore()/canFetchMore() 背后的 Qt 模型

    我很想知道当具有增量数据获取的主数据模型位于代理或代理链后面时 视图将如何表现 代理如何进行项目重新排列 例如取消分组代理 示例 http lynxline com jongling qt models http lynxline com
  • 如何在修改后更新 Android 视图?

    我的视图中有一些方法可以修改调用时绘制的一些形状 在 Java 中 为了确保组件已更新 我会调用repaint 有什么可以确保我的视图正确更新吗 我曾在某处读到过这样的呼唤invalidate in the onDraw 方法将使事情保持最
  • HTTP_INTERCEPTORS 仅在 AppModule 中

    我正在尝试在我的 Angular 6 应用程序中实现延迟加载 我所有的 http 调用都是在FeatureModule 延迟加载 但我仍然必须添加HttpClientModule in my AppModule并且不在FeatureModu
  • Node.js 中的 HTTP.request 不断收到错误请求

    我刚刚安装了 Node js 也许我遗漏了一些东西 但我正在尝试一个简单的 http request 但除了 400 个响应之外什么也没有得到 我已经尝试了几个主机但没有运气 我从他们的网站安装了 Node 这不起作用 所以我卸载并通过 H
  • EPPlus:在单元格中定位图像

    我正在尝试使用 Epplus 将图像 插入 Excel 中的单元格 使用以下代码 private static void SetImage ExcelWorksheet sheet ExcelRange cell using WebClie
  • 这个正则表达式是什么意思 - “\p{Lu}”?

    我在 C 中偶然发现了这个正则表达式 我想移植到 javascript 但我不明白以下内容 p Lu p Ll 0 9 当然 我遇到困难的部分是 p Lu 我访问过的所有正则表达式网站都没有提到这个修饰符 任何想法 这些都被考虑Unicod
  • Ruby on Rails - 验证成本

    验证用户输入的成本 价格的最佳方法是什么 验证规则如下 允许的格式示例 23 2 1 23 0 25 5 6 3 小数点后最多两位数 最小值 0 01 最大值 9 99 检查价格并验证格式 rails 3 validates price f
  • MySQL 将 secure-file-priv 设置为多个目录

    有没有办法让MySQL从多个目录加载数据而不需要设置secure file priv 例如 类似 secure file priv path to dir1 path to dir2 从阅读docs https dev mysql com
  • 如何在gridview适配器中回收位图?

    我的 android 应用程序中有一个网格视图 我正在从服务器将图像加载到网格视图 我正在使用延迟加载 我必须回收此处创建的所有位图 如何在适配器或网格视图中执行 Bitmap recycle 我失忆了 请帮助我 您将需要显示一些代码 至少
  • 从 EC2 实例内查找区域

    有没有办法从实例内部查找实例的区域 我正在寻找类似于方法的东西查找实例 ID https stackoverflow com questions 625644 find out the instance id from within an
  • Bash 参数扩展分隔符

    我想得到1 2 3 4 5 6 7 8 9 10使用参数扩展 1 10 和模式匹配 var echo 1 10 echo var 1 2 3 4 5 6 7 8 9 10 有没有一种更优雅的方式 单行 来做到这一点 优雅在于情人眼中 set
  • 是否有针对各种操作系统(和版本)的预处理器定义列表?

    例如的映射 Mac OS 10 6 3 又名 Snow Leopard gt APPLE LP64 Windows 7 Windows XP gt WIN32 Linux gt LINUX 干得好 http predef sourcefor
  • 重新排序 .strings 文件

    In my Localizable Strings我尝试按字母顺序排列所有对 是否可以按字母顺序重新排序我的Localizable strings文件不区分大小写 也许使用 genstring 或特殊的 bash 脚本 例如我有字符串 ap
  • 为什么 Objective-C 实例变量要在接口中声明?

    我刚刚开始接触 Objective C Java 是我的主要面向对象语言 在接口而不是类中定义对象的实例变量似乎很奇怪 我习惯了接口作为公共 API 定义 除了方法签名之外什么都没有 这里不包括常量 是否有某种原因导致状态在接口中定义 即使
  • QGraphicsLineItem::paint() 工件

    我有自己的类 它继承自QGraphicsLineItem并覆盖paint 绘制带箭头的粗线的方法 void MyGraphicsItem paint QPainter aPainter const QStyleOptionGraphicsI