跨多个QPlainTextEdits同时选择文本

时间:2015-10-21 15:03:09

标签: c++ qt c++11

我目前正在Qt 5+中编写一个简单的Hex Viewer应用程序。 我几乎所有的东西都在一起,但我真的在最后一个问题上苦苦挣扎,我可以使用一些帮助。

现在,我有一个主窗口,其中有3个子类QPlainTextEdit小部件(用于处理所有3个的同时滚动)连续显示给用户。第一列只是行地址索引,第二列是十六进制视图,第三列是ASCII转换,其中每个不在扩展ASCII中的字符都替换为'。'。 (像大多数十六进制观众一样)。我所拥有的一切都按预期工作,但我不知道在哪里可以使用我需要的最后一个功能。

当用户在中间文本编辑中突出显示十六进制时,我希望在右侧文本编辑中突出显示与其相关的ASCII(反之亦然)。我不明白如何去做最后一项任务。

有人可以指出我正确的方向并帮助我解决这个问题吗?另一个问题是我需要在十六进制视图中考虑空间,因为它将每一行显示为

XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

在第一个问题得到解答后,我确信这方面是微不足道的。

2 个答案:

答案 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 selectSelecting 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);
    }
}