Currently, I am in the design phase of a widget like what one would see in a typical hex editor. It seemed simple enough to begin with, but as I dig into its implementation details I'm having some confusion.
Basically, the widget would consist of 3 core components: It will inherit QAbstractScrollArea or QScrollArea to provide scrolling and, in the viewport margin, it will display the file offset of each line. Then there will be two text editors; one with the hexadecimal value of each byte of the file, and one with the plaintext character representation.
I, of course, first checked qt-apps.org for any existing widgets, but a search for "hex" only returned QHexEdit and qPHexEditor, neither of which are very complete. I then considered creating a widget completely from scratch as they had, but felt like there should be a more elegant solution. Qt already has much text-editor functionality built into QTextEdit and QPlainTextEdit; why reinvent the wheel?
Now, while the "plaintext view" would be as simple as using a QPlainTextEdit with a fixed-width font and a width of 16 characters, the "hex view" is giving me a headache. I've been poring over QTextEdit, QAbstractTextDocumentLayout, etc., trying to figure out a way to present the desired appearance. For those who have never used a hex editor, it should function like so:
- Using a fixed-width font, widget should be the width of 47 characters
- Widget should display 2 hexadecimal characters per byte, with a blank space between bytes---16 bytes per line
Since that thought, I've been trying to figure out how to subclass any related classes to provide the desired formatting. Unfortunately, the text editing classes don't seem to follow the model/view framework as closely as I'd hoped, so deriving a new "view" for it doesn't seem easy. Ideally, the widget would function like so:
One document/model for both the "hex" and "plaintext" views. Editing either view would adjust this model and update the other view appropriately. Signals/Slots at its best.
Because QTextEdit and QPlainTextEdit already provide much of the functionality needed (visible cursor, selections, undo/redo, native look and feel, etc), it would be ideal to re-use this.
So, does anyone have any recommendations? I appreciate any input on this.