image - qt用鼠标在Qtextedit中调整图像大小
问题描述
我的项目是实现一个像 Word 这样的文本编辑器。除了用鼠标调整图像大小(如 Word 2016)之外,一切都很好我如何在 QTextEdit 中检测图像,如何选择它然后用鼠标调整它的大小。我检查了在 stackoverflow 中发布的示例,该示例使用 qdialog 来调整图像大小,但我需要用鼠标来完成。请问有什么想法吗?
解决方案
有四种渲染方式QTextEdit
。
1.QImageFormat
这是最标准的方式QTextEdit
。重要的是QTextCursor
处理。2.QTextObjectInterface
这是第二种方式,但非常有用。
3.QGraphicsPixmapItem
你必须提前导入QGraphicsView
&QGraphicsScene
但不受约束。QTextBlock
它非常活泼和自由。
4.QPainter drawImage
本来是为了非交互的方式。我在这个答案中不使用它。
我推荐(1 或 2)和 3 组合。
当鼠标点击
1.您在QTextEdit
.
2.点击图片。
3.光标必须移动到图像之前或之后。
4.也就是说,光标位置必须在图像之前或之后。
5-a我认为你可以通过 QTextCursor 处理来捕捉图像格式。
5-b.如果你使用QTextObjectInterface
,你可以捕捉到“\ufffc”字符。
6Imageformat
属于一个字符,因此您可以通过movePosition
带有KeepAnchor
标志的方法选择和捕获图像QTextCursor
。
- 提前准备好 QGraphics 引擎。
7-1 你可以抓住cursorRect
并获得 上的位置QTextEdit
。您可以使用 cursorRect 的位置,以及图像的宽度和高度。您可以使用它们指定图像。
然后,您调用 QGraphicsItems。你打电话QGraphicsScene.addItem()
10.您在子类中定义控制计算QGraphicsRectItem
。您可能想知道计算方式...
这可能是全局对象,因为它们是临时使用的。
当鼠标移动
11.大概,我解释一下。
我认为您将鼠标光标向左移动,图像正在向右扩展。
好像是MicroSoft Word中的同一个控件。总之,你可能不会想到高度的变化。不用说,你一定不能改变八个rect项的大小。
这可能是一个技巧,QGraphicsRectItem.setCursor(QtCore.Qt.PointingHandCursor)
很有帮助。
我认为变化的比率是+1或-1是最好的。至少,起初它并不复杂,也很容易理解。我建议您不要匹配鼠标光标的移动。最终,用户将难以协调图像的大小。
你更新宽度和高度
QGraphicsRectItem
。而你setWidth
&setHeight
同时。这是非常重要的。您在同一位置一次又一次地删除并重新插入图像。用户似乎会自动变大或变小。但图像会立即删除并添加。当然,您必须重新插入更大或更小的图像。您必须在同一位置重新插入。所以你安装
setKeepPositionOnInsert(True)
,插入后,`setKeepPositionOnInsert(False)' 可能很重要。因为插入后,位置会在插入文本的后面。
后
15.如果您结束对图像的操作,则从场景中删除矩形。
16.我忘了说,installEventFilter
移动鼠标和连接效果到rectItem可能需要它。但是如果rectItems是全局的,你可以在QTextEdit
,mouseEvent处理中调用它们。
ps如果你不明白我说的,请不要犹豫,通过评论问我。
推荐阅读
- android - Flutter 模块等级文件不断重置
- python - TensorFlow 中的 Flatten() 层如何工作?
- angular - 命名空间“google.maps”没有导出的成员“MouseEvent”。安装 @agm/core 和 @types/google
- sql - postgres中的多表插入
- node.js - 有没有办法让 Mongo Db 中的整数自动增量字段作为不同于标准 ID 的文档/表格的一部分?
- yaml - Kubernetes ConfigMap 自动将 Literal 更改为 Folded Block Scalar
- c# - 如何在嵌入独木舟的 ac#.net testproject 中使用其他库
- java - Java多态序列
- python - 在 Pandas Python 中创建依赖于另一个数据框的新数据框时出现问题
- amazon-web-services - 从我的本地计算机访问我在 Amazon Web Services 中的数据库涉及哪些事情?