Here is what did:
Qt Code:
  1. QTextCursor cursor = this->textCursor();
  2. blockFmt.setNonBreakableLines(true);
  3. blockFmt.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysBefore);
  4. charFmt.setFont(data->visualFont());
  5. if(!cursor.hasSelection()) {
  6. cursor.beginEditBlock();
  7. cursor.setBlockFormat(blockFmt);
  8. cursor.mergeBlockCharFormat(charFmt);
  9. QTextBlock block = cursor.block();
  10. block.setUserData(data);
  11. cursor.endEditBlock();
  12. }
To copy to clipboard, switch view to plain text mode 

What I want to do is: change current line's format if there is no selection. So if cursor.hasSelection() is false, I just merge new format to block chars. But this does not work.