Хорошо, поэтому у нас есть метод частного слова textChanged, который уведомляет нас об изменении объекта textEdit. Эта реализация довольно надежна и сообщает нам, когда текст вставлен с клавиатурой, с копией и вставкой, и многое другое.
Однако есть ли какой-либо текст, который был изменен?
Как сказал Игорь, вы можете использовать QTextDocument
. Используйте этот пример кода:
Подключение:
connect( ui->textEdit->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(change(int,int,int)));
Создать слот:
void MainWindow::change(int pos, int del, int add)
{
QString added = ui->textEdit->toPlainText().mid(pos,add);
qDebug() << added;
}
В заголовке:
void change(int, int, int);
И теперь вы можете получить текст, который был вставлен или набран в QTextEdit
О производительности. Пусть эксперимент. Напишите этот слот.
void MainWindow::clicked(int pos, int del, int add)
{
QElapsedTimer tmr;
tmr.start();
QString added = ui->textEdit->toPlainText().mid(pos,add);
qDebug() << added;
qDebug() << "operation tooks" << tmr.elapsed() <<" ms";
}
Не забывайте #include <QElapsedTimer>
Вывод при вводе:
operation tooks 0 ms
"f"
operation tooks 0 ms
"d"
operation tooks 0 ms
"g"
operation tooks 0 ms
"r"
operation tooks 0 ms
"d"
operation tooks 0 ms
"s"
operation tooks 0 ms
"f"
operation tooks 0 ms
Вывод, когда я вставляю текст с 7817 символами, включая пробелы:
...long text...
operation tooks 0 ms
Попробуйте на своем компьютере, я думаю, что это нормальная эффективность.
textEdit.toPlainText()
, возможно? Я не уверен, что понимаю природу трудности.QTextEdit::document()
и объектQTextDocument
. Последний испускает сигналы с более подробной информацией об изменении.