Windows 7 SP1
MSVS 2010
Qt 4.8.4
我正在使用QTextCursor
来抓取每个块的文本。我使用select(QTextCursor::BlockUnderCursor)
抓取文本,然后使用movePosition(QTextCursor::NextBlock)
转到下一个块。但是当我再次select(QTextCursor::BlockUnderCursor)
时,我在QString
中得到了一个额外的垃圾字符,并且锚点已经移动到上一个块的末尾。
将其用于text.txt:
A
B
此代码的评论会逐步解决问题并提出问题:
#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();
}
答案 0 :(得分:1)
这不是垃圾。第一个字符包括U + 2029段落分隔符(HTML:PSEP)。换句话说,选择块包括起始段落分隔符。第一个块没有启动SEP。因此,如果想要单独提取后续块的文本,则需要排除第一个字符。
答案 1 :(得分:0)
导航值与QTextBlock
的性质有关,以及如何按块导航以及由BlockUnderCursor
确定的内容。文档提供了一些见解:
http://doc.qt.digia.com/main-snapshot/qtextblock.html#details
以下是文档的另一部分对我有用:
http://doc.qt.digia.com/main-snapshot/qtextblockformat.html#details
我没有尝试过您所发现的内容,但以下是我对此的一些看法:
在某些方面,我认为它就像在MS Word文档中按下Ctrl + Up或Ctrl + Down一样。其中一些可能与您使用的行结尾有关。 “\ r \ n”v。“\ n”。我知道有时候“eof”这个角色很奇怪。某些文档和格式在文件结束前需要换行。
希望有所帮助。