2013-02-13 73 views
0

的Windows 7 SP1
MSVS 2010
的Qt 4.8.4
爲什麼select(QTextCursor :: BlockUnderCursor)包含額外的垃圾字符?

我使用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(); 
} 

回答

1

這不是垃圾。第一個字符包括U + 2029段落分隔符(HTML:
 PSEP)。換句話說,選擇塊包括起始段落分隔符。第一個塊沒有啓動SEP。因此,如果想單獨提取後續塊的文本,則需要排除第一個字符。

0

導航值有一個QTextBlock的性質做,以及如何通過塊導航以及由BlockUnderCursor確定的內容。該文檔提供了一些洞察到這一點:

http://doc.qt.digia.com/main-snapshot/qtextblock.html#details

這裏是文檔的另一部分似乎對我很有幫助:

http://doc.qt.digia.com/main-snapshot/qtextblockformat.html#details

我還沒有跟你發現了什麼嘗試,但在這裏是我的一些想法:

在某些方面,我認爲它像在Windows中按下Ctrl + Up或Ctrl + Down在MS Word文檔。其中一些可能與您正在使用的行結尾有關。 「\ r \ n」v。「\ n」。我知道有時候「eof」角色很奇怪。某些文件和格式在文件字符結束之前需要換行。

希望有所幫助。