メニューボタンが押されたときにQPlainTextEditのテキストをインデントしたいとします。ボタンが押されたとき、私は現在選択されている行がインデントされていない場合、現在の行をインデントします。現在、コードは1行で動作しますが、インデントを行うと行の最後の部分が消えるようになります。例えば、私が行:"Artificial Intelligence stands no chance against Natural Stupidity."
を持っている場合、字下げの後にそれはちょうど:" Artificial Intelligence stands no chance against Natural Stupidi
であり、その後、私はその行に書き始めます。また、文章の一部が消えてから、その行にカーソルを置いたり、カーソルを置いたりすると、プログラムがクラッシュします。QtプログラムがクラッシュするQTextCursorでQTextEditが変更される
コード:
void MainWindow::on_action_Indent_triggered()
{
Document* doc = dynamic_cast<Document*>(ui->tabsManager->currentWidget());
QTextCursor cursor = doc->textArea->textCursor();
cursor.beginEditBlock();
// If ther is no text selected...
if (cursor.selection().isEmpty()) {
cursor.movePosition(QTextCursor::StartOfLine);
cursor.insertText(this->tabLength);
} else { // If the selection is not empty...
cursor.beginEditBlock();
// Save selection start and end
int start = cursor.selectionStart();
int end = cursor.selectionEnd();
cursor.clearSelection();
// Set end to the end of line of the selected line
cursor.setPosition(end);
cursor.movePosition(QTextCursor::EndOfLine);
end = cursor.position();
// Set cursor to the start of the first selected line
cursor.setPosition(start);
cursor.movePosition(QTextCursor::StartOfLine);
start = cursor.position();
// While still in the selection, add " " to the start of each line
do {
cursor.movePosition(QTextCursor::StartOfLine);
cursor.insertText(this->tabLength);
end += this->tabLength.count();
cursor.movePosition(QTextCursor::EndOfLine);
} while (cursor.position() < end && cursor.movePosition(QTextCursor::Down));
// Select the changed areatabLenght
cursor.clearSelection();
cursor.setPosition(start);
while (cursor.position() < end)
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
}
// Set the cursor in the GUI
doc->textArea->setTextCursor(cursor);
cursor.endEditBlock();
}
ドキュメントは、クラスであるおよびTextAreaはQTextPlainEditです。 this-> tabLengthは ""の値を持つQStringです