我目前正在Qt 5+中编写一个简单的Hex Viewer应用程序。 我几乎所有的东西都在一起,但我真的在最后一个问题上苦苦挣扎,我可以使用一些帮助。
现在,我有一个主窗口,其中有3个子类QPlainTextEdit
小部件(用于处理所有3个的同时滚动)连续显示给用户。第一列只是行地址索引,第二列是十六进制视图,第三列是ASCII转换,其中每个不在扩展ASCII中的字符都替换为'。'。 (像大多数十六进制观众一样)。我所拥有的一切都按预期工作,但我不知道在哪里可以使用我需要的最后一个功能。
当用户在中间文本编辑中突出显示十六进制时,我希望在右侧文本编辑中突出显示与其相关的ASCII(反之亦然)。我不明白如何去做最后一项任务。
有人可以指出我正确的方向并帮助我解决这个问题吗?另一个问题是我需要在十六进制视图中考虑空间,因为它将每一行显示为
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
在第一个问题得到解答后,我确信这方面是微不足道的。
答案 0 :(得分:0)
可以使用自定义光标进行选择。您可以将此类游标与QPlainTextEdit一起使用。
QTextCursor *cursor = new QTextCursor(ui->plainTextEdit->document());
cursor->setPosition(StartPos,QTextCursor::MoveAnchor);
cursor->setPosition(EndPos,QTextCursor::KeepAnchor);
cursor->select(QTextCursor::BlockUnderCursor);
请参阅:Qt: create custom QTextCursor select和Selecting a piece of text using QTextCursor
答案 1 :(得分:0)
这是一个有效的Qt4代码示例(Qt5应该是相同的)。
复制并更改从一个textedit到另一个textedit的选择。
刚刚使用QtCreator创建了项目。添加了两个QPlainTextEdits并在头文件中添加了插槽。
这是.cpp文件的重要部分:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextCursor>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->textEdit1, SIGNAL(selectionChanged()), SLOT(selectionEdit1Changed()));
connect(ui->textEdit2, SIGNAL(selectionChanged()), SLOT(selectionEdit2Changed()));
ui->textEdit1->setPlainText("1234567891234567891234567891234567891234567890");
ui->textEdit2->setPlainText("1234567890123456789123456789123456789123456789");
ui->textEdit1->setReadOnly(true);
ui->textEdit2->setReadOnly(true);
}
void MainWindow::selectionEdit1Changed()
{
QTextCursor tc = ui->textEdit1->textCursor();
int newSelectionEnd = tc.selectionEnd()/2;
if(ui->textEdit2->toPlainText().size() > newSelectionEnd) {
tc.setPosition(tc.selectionStart(),QTextCursor::MoveAnchor);
tc.setPosition(newSelectionEnd,QTextCursor::KeepAnchor);
ui->textEdit2->setTextCursor(tc);
}
}
void MainWindow::selectionEdit2Changed()
{
QTextCursor tc = ui->textEdit2->textCursor();
int newSelectionEnd = tc.selectionEnd()*2;
if(ui->textEdit1->toPlainText().size() > newSelectionEnd) {
tc.setPosition(tc.selectionStart(),QTextCursor::MoveAnchor);
tc.setPosition(newSelectionEnd,QTextCursor::KeepAnchor);
ui->textEdit1->setTextCursor(tc);
}
}