Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt4]получение последнего символа из QTextEdit


Автор: anatox91 6.6.2008, 14:45
вобщем есть такая проблема. Надо узнать последний символ введенный в QTextEdit. toPlainText() не подойдет, т.к. мне не нужен весь текст, и это будет неэффективно при работе с большим объемом текста. Пример:
Код

void TextEdit::keyPressEvent(QKeyEvent *keyEvent) {
     if(keyEvent->key() == Qt::Key_Return) {
                        //вот здесь - если последний символ такой-то - сделать то-то

в документации чет ниче похожего не нашел... у QTextCursor'a тоже вроде ниче нужного нема...
заранее спасибо!

Автор: Elfebet 6.6.2008, 15:23
Тебе нужен последний введенный символ или последний символ в тексте.
если первое то keyPressEvent(QKeyEvent *keyEvent) и будет последний символ
если второе тебе все равно прийдется делать  toPlainText(), ведь чтобы найти последний символ для этого нужен текст, где искать, правильно?

Автор: anatox91 6.6.2008, 15:26
Elfebet, да, я немного неправильно выразился, мне нужен последний символ в тексте, но получать через toPlainText() может быть не слишком быстро если текст большой... вот я почему и спрашиваю, мне нужен не весь текст, а только его последний символ, может как-то через QTextCursor можно это сделать...

Автор: SABROG 6.6.2008, 15:30
Может быть тогда есть смысл посмотреть в сторону QDataWidgetMapper ?

Автор: anatox91 6.6.2008, 16:41
насколько я понял это для model/view-представления, а мне нужно для QTextEdit  smile 
вообще говоря, я хочу сделать фишку, которая есть во всех IDE(под С++) - когда вводится символ "{" или ":" и нажимается Enter, то курсор должен перескакивать не просто наследующую строку, а еще и под этим символом. Поэтому мне и показалось, что если для этого каждый раз делать банально toPlainText(), то это будет медленно работать, если объем текста большой...

Автор: anatox91 6.6.2008, 17:46
вобщем, сделал так:
Код

void TextEdit::keyPressEvent(QKeyEvent *keyEvent) {
     if(keyEvent->key() == Qt::Key_Return) {
                        QString text = toPlainText();
                        if((text.right(1) == "{") || (text.right(1) == ":")) {
                                          int n = textCursor().columnNumber();
                                          insertPlainText("\n");
                                          for(int i=0; i < n; ++i) insertPlainText(" ");
                                          return;
                                          }
                                          }
     QTextEdit::keyPressEvent(keyEvent);
}

но сабж еще интересует

Автор: Elfebet 6.6.2008, 18:08
а если просто запоминать, что нажата клава shift+[ или shift+; то это знак "{ или :" и если следующий символ идет Qt::Key_Return то выполняеш это дейсвие, иначе ниче не делаеш

Автор: anatox91 6.6.2008, 19:28
Elfebet, мне кажется должен быть вариант покрасивее, может быть через QTextCursor... 

Автор: JackYF 7.6.2008, 00:16
Цитата(anatox91 @  6.6.2008,  15:41 Найти цитируемый пост)
когда вводится символ "{" или ":" и нажимается Enter, то курсор должен перескакивать не просто наследующую строку, а еще и под этим символом

Запоминай два последних введённых символа smile Памяти немного, доступ константный smile

Автор: anatox91 7.6.2008, 12:40
всем спасибо, проблема решена через QTextBlock:
Код

QString text = textCursor().block().text();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)