[PyQt] binary file viewer with textEdit (PyQt) [correction]
list at qtrac.plus.com
Thu Jun 24 16:26:27 BST 2010
On 2010-06-24, sandokan wrote:
> Mark Summerfield-4 wrote:
> > [snip]
> > Actually I meant:
> > file = QFile(self.filename)
> > if file.open(QIODevice::ReadOnly):
> > ba = file.readAll() # ba is a QByteArray filled with raw bytes
> > hexbytes = 
> > for i in range(ba.count()):
> > if QChar(" ") < QChar(ba[i]) < QChar(128):
> > hexbytes.append(ba[i].toAscii())
> > else:
> > hexbytes.append(ba[i].toHex())
> > # the above might need to be:
> > # hexbytes.append(QByteArray(ba[i]).toHex())
> > # or even:
> > # hexbytes.append(str(QByteArray(ba[i]).toHex()))
> > self.ui.textEditAscii1.setPlainText("".join(hexbytes))
> > Still untested though!
> Hmm, this appending approach is very slow again :( Moreover, I need to be
> able to print out also non-printable ASCII characters (0-32) and not to
> show them as hex.
> However thank you for you comments, I will try to think about different
> solution...if you have any other idea then please let me know
Well here's one last sketch of an idea (and this will work well no
matter how big the file).
- Create a plain QWidget and lay it out with a vertical scrollbar.
- Set the QWidget's font to be fixed width.
- Use QFontMetrics for the fixed width font to calculate how many
characters wide the widget is and how many lines high.
- Instead of reading the entire file, just read enough to occupy the
space available and in the QWidget's paintEvent() use drawText() to
- Set the scroll bar proportional to the size of the file and how much
can be displayed.
- If the user scrolls read in what's needed and repaint.
This approach is a lot more work but potentially it could be very fast
and also use the least amount of memory.
Mark Summerfield, Qtrac Ltd, www.qtrac.eu
C++, Python, Qt, PyQt - training and consultancy
"Advanced Qt Programming" - ISBN 0321635906
More information about the PyQt