PDA

View Full Version : Why does select(QTextCursor::BlockUnderCursor) include an extra junk character?



therefore
13th February 2013, 23:37
Windows 7 SP1
MSVS 2010
Qt 4.8.4

I am using QTextCursor to grab each block's text. I use select(QTextCursor::BlockUnderCursor) to grab the text and then go to the next block with movePosition(QTextCursor::NextBlock). But when I again select(QTextCursor::BlockUnderCursor) I get an extra junk character in the QString and the anchor has moved to the end of the previous block.

Using this for text.txt:


A
B

This code's comments walks through the issue and asks the questions:


#include <QTGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow* window = new QMainWindow;
QTextEdit* editor = new QTextEdit(window);
QTextDocument* document = new QTextDocument(window);

editor->setDocument(document);
QFile file("test.txt");
if (file.open(QFile::ReadOnly | QFile::Text))
editor->setPlainText(file.readAll());

QTextBlock block = document->begin();
QTextCursor* cursor = new QTextCursor(document);
int pos = cursor->position(); // = 0
int anchor = cursor->anchor(); // = 0

cursor->select(QTextCursor::BlockUnderCursor);
pos = cursor->position(); // = 1
anchor = cursor->anchor(); // = 0

QString text = cursor->selectedText(); // = "A"
int size = text.size(); // = 1

cursor->movePosition(QTextCursor::NextBlock);
pos = cursor->position(); // = 2
anchor = cursor->anchor(); // = 2

cursor->select(QTextCursor::BlockUnderCursor);
pos = cursor->position(); // = 3
anchor = cursor->anchor(); // = 1 Why not 2?

text = cursor->selectedText(); // "B" in debugger
// but text.at(0) = junk & test.at(1) = "B"
size = text.size(); // = 2 Why? Why not 1?

return app.exec();
}

norobro
14th February 2013, 02:13
From the docs ( QTextCursor::selectedText() ):
Note: If the selection obtained from an editor spans a line break, the text will contain a Unicode U+2029 paragraph separator character instead of a newline \n character.
You can check by putting the following statement in your code:
qDebug() << QString("U+%1").arg(text.at(0).unicode(),0,16);

therefore
14th February 2013, 04:01
Thanks for the education! Now I get it. In other words, selecting the block includes the starting paragraph separator. The first block doesn't have a starting SEP. Therefore, need to exclude the first character if one wants to extract the text alone of subsequent blocks.

norobro
14th February 2013, 04:30
You're welcome. If you just want the text use QString::trimmed():
text = cursor->selectedText().trimmed();