目前,我正处于 Qt 小部件的设计阶段,就像在典型的十六进制编辑器中看到的那样。一开始似乎很简单,但是当我深入研究它的实现细节时,我有些困惑。
基本上,小部件将由 3 个核心组件组成:它将继承 QAbstractScrollArea 或 QScrollArea 以提供滚动,并且在视口边距中,它将显示每行的文件偏移量。然后会有两个文本编辑器;一个是文件每个字节的十六进制值,另一个是纯文本字符表示。
当然,我首先检查了 qt-apps.org 是否有任何现有的小部件,但搜索“hex”只返回 QHexEdit 和 qPHexEditor,它们都不是很完整。然后我考虑像他们一样完全从头开始创建一个小部件,但觉得应该有一个更优雅的解决方案。Qt 已经在 QTextEdit 和 QPlainTextEdit 中内置了很多文本编辑器功能;为什么要重新发明轮子?
现在,虽然“纯文本视图”就像使用具有固定宽度字体和 16 个字符宽度的 QPlainTextEdit 一样简单,但“十六进制视图”让我头疼。我一直在研究 QTextEdit、QAbstractTextDocumentLayout 等,试图找出一种呈现所需外观的方法。对于那些从未使用过十六进制编辑器的人,它的功能应该是这样的: – 使用固定宽度的字体,小部件应该是 47 个字符的宽度 – 小部件应该每个字节显示 2 个十六进制字符,字节之间有一个空格——每行 16 个字节
从那个想法开始,我一直在试图弄清楚如何对任何相关类进行子类化以提供所需的格式。不幸的是,文本编辑类似乎没有像我希望的那样紧密地遵循模型/视图框架,因此为它派生一个新的“视图”似乎并不容易。理想情况下,小部件的功能如下:
“十六进制”和“纯文本”视图的一个文档/模型。编辑任一视图将调整此模型并适当地更新另一个视图。信号/插槽处于最佳状态。因为 QTextEdit 和 QPlainTextEdit 已经提供了许多所需的功能(可见光标、选择、撤消/重做、本机外观等),所以重用它是理想的。
那么,有人有什么建议吗?我很感激对此的任何意见。