1、说明
类似于串口调试工具,输入十六进制数据时按照两位自动进行分隔。
2、显示效果
3、代码
#ifndef QHEXPLAINTEXTEDIT_H
#define QHEXPLAINTEXTEDIT_H
#include <QPlainTextEdit>
class QHexPlainTextEdit : public QPlainTextEdit
{
Q_OBJECT
public:
enum EmDataFormat
{
EmFormatHex,
EmFormatAscii
};
explicit QHexPlainTextEdit(QWidget *parent = nullptr);
void setDataFormat(QHexPlainTextEdit::EmDataFormat emFormat);
QHexPlainTextEdit::EmDataFormat GetDataFormat();
private:
QString formatHexString (const QString& hex);
public slots:
void plainTextChanged();
private:
EmDataFormat m_emDataFormat;
};
#endif // QHEXPLAINTEXTEDIT_H
#include "QHexPlainTextEdit.h"
#include <QTextCursor>
QHexPlainTextEdit::QHexPlainTextEdit(QWidget *parent) : QPlainTextEdit(parent)
{
m_emDataFormat = EmFormatHex;
connect(this,SIGNAL(textChanged()),this,SLOT(plainTextChanged()));
}
void QHexPlainTextEdit::setDataFormat(QHexPlainTextEdit::EmDataFormat emFormat)
{
m_emDataFormat = emFormat;
if(m_emDataFormat == EmFormatHex)
{
plainTextChanged();
}
else
{
disconnect(this,SIGNAL(textChanged()),this,SLOT(plainTextChanged()));
}
}
QHexPlainTextEdit::EmDataFormat QHexPlainTextEdit::GetDataFormat()
{
return m_emDataFormat;
}
QString QHexPlainTextEdit::formatHexString(const QString& hex)
{
QString strContent = hex;
QRegExp regExp("([^A-Fa-f0-9]*)");
strContent.remove(regExp);
QRegExp rx("([0-9A-Fa-f]{1,2})");
QStringList list;
int pos = 0;
while ((pos = rx.indexIn(strContent, pos)) != -1)
{
list << rx.cap(1);
pos += rx.matchedLength();
}
return list.join(" ");
}
void QHexPlainTextEdit::plainTextChanged()
{
disconnect(this,SIGNAL(textChanged()),this,SLOT(plainTextChanged()));
QTextCursor textCursor = this->textCursor();
int recordPos = textCursor.position();
QString strContent = toPlainText();
strContent = formatHexString(strContent);
setPlainText(strContent);
if(recordPos > strContent.size())
{
recordPos = strContent.size();
}
else if(recordPos > 0)
{
QString ch= strContent.mid(recordPos-1,1);
if(ch == " ")
{
recordPos++;
}
}
textCursor.setPosition(recordPos);
setTextCursor(textCursor);
connect(this,SIGNAL(textChanged()),this,SLOT(plainTextChanged()));
}