メニューボタンが押されたときにQPlainTextEditのテキストをインデントしたい。ボタンが押されたときに、選択範囲があるかどうかを尋ねます。選択範囲がある場合は、現在の行をインデントします。選択範囲内のすべての行をインデントします。現在、コードは1行で機能しますが、選択範囲をインデントすると、行の最後の部分が消えるようなものです。たとえば、次の行がある場合"Artificial Intelligence stands no chance against Natural Stupidity."
、インデントの後には次のようになります。" Artificial Intelligence stands no chance against Natural Stupidi
その後、その行に書き込みを開始すると、現在の文の終わりに達するとテキストが消え始めます。また、文の一部が消えた後、その行をクリックまたはカーソルを置くと、プログラムがクラッシュします。
コード:
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();
}
Documentはクラスであり、textAreaはQTextPlainEditです。this-> tabLengthは、値が「」のQStringです。