crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> перемещение курсора в QTextEdit
void*
  опции профиля:
сообщение 5.6.2008, 11:13
Сообщение #1


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


добрый день! есть вопрос:
как сделать чтобы если в QTextEdit'е ввели символ { или : и нажали Enter, то курсор перемещается не в начало следующей строки, а на следующую строку и под этим символом?
заранее большое спасибо!

Сообщение отредактировал void* - 5.6.2008, 11:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.6.2008, 12:32
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Примерно так:
#include <QtGui/QApplication>
#include <QTextEdit>
#include <QKeyEvent>


class CTextEdit: public QTextEdit
{
public:
    CTextEdit( QWidget *pParent = 0);

protected:
    virtual bool event( QEvent *pEvent);
};

CTextEdit::CTextEdit( QWidget *pParent):QTextEdit( pParent)
{
}

bool CTextEdit::event( QEvent *pEvent)
{
    if( pEvent->type() == QEvent::KeyPress)
    {
        QKeyEvent *pKeyEvent = static_cast<QKeyEvent *>(pEvent);
        if( pKeyEvent->key() == Qt::Key_Return)
        {
            QString szText = toPlainText();
            if( szText.right( 1)=="{" || szText.right( 1)==":")
            {
                insertPlainText( "\r\n-->");
                return true;
            }
        }                
    }

    return QTextEdit::event( pEvent);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    CTextEdit te;
    te.show();

    return a.exec();
}
Тебе осталось только получить расстояние до "{" или ":" и заменить --> на него... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.6.2008, 12:50
Сообщение #3


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


1)QTextEdit::toPlainText() по-моему получает весь текст из области, можно ли как-то получать только одну данную линию текста?
2)в моем случае скорее надо вместо QString::right() использовать QString::left(), т.к. когда Ентер нажат, то символ уже введен...
3)может проще сделать через keyPressEvent?
вообще, пример того, что я хочу сделать - есть в любой IDE, но я чего-то путаюсь с передвиганием курсора
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.6.2008, 13:53
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Критика конечно же обоснована, но я это набросал как пример для наглядности того, как сделать то, что ты хочешь. Потому оптимизацией занимайся как-нибудь сам... ;)

Получить позицию можно так:
int n1 = pTextEdit->textCursor().blockNumber();
int n2 = pTextEdit->textCursor().columnNumber();


Цитата(void* @ 5.6.2008, 13:50) *
но я чего-то путаюсь с передвиганием курсора
Что именно не понятно?

Сообщение отредактировал ViGOur - 5.6.2008, 13:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 5.6.2008, 14:03
Сообщение #5


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


ладно, чуть позже еще пошаманю над этим
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 6.6.2008, 14:27
Сообщение #6


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


ViGOur, и все-таки можно ли как-то получить только последнюю строку или, что еще лучше, символ, а не весь текст, как здесь у тебя:
QString szText = toPlainText();

?
потому что, я думаю, этот способ будет очень неэффективен для больших объемов текста, расположенных в TextEdit'e

параллельно роюсь в ассистенте...
З.Ы. насчет второго пункта я был неправ, неправильно понял работу этой функции

Сообщение отредактировал void* - 6.6.2008, 17:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 6.6.2008, 17:43
Сообщение #7


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


уррряя! получилось :rolleyes: большое спасибо!
выкладываю код, может кому еще понадобится:
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);
}


Сообщение отредактировал void* - 6.6.2008, 17:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 6.6.2008, 19:12
Сообщение #8


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


немного усовершенствовал:
void TextEdit::keyPressEvent(QKeyEvent *keyEvent) {
     if(keyEvent->key() == Qt::Key_Return) {
                        QString text = toPlainText();
                        if((text.right(1) == "{") || (text.right(1) == ":")) {
                                          n = textCursor().columnNumber();
                                          insertPlainText("\n");
                                          for(int i=0; i < n; ++i) insertPlainText(" ");
                                          return;
                                          }
                        if(text.right(1) == "}") {
                                         if(n) {
                                               n=0;
                                               QTextEdit::keyPressEvent(keyEvent);
                                               }
                                               }
                        if(n) {
                              insertPlainText("\n");
                              for(int i=0; i < n; ++i) insertPlainText(" ");
                              return;
                              }
                                          }
     QTextEdit::keyPressEvent(keyEvent);
}

(n - целочисленная переменная, хранящаяся в классе и инициализирущаяся в конструкторе для начала нулем)

Сообщение отредактировал void* - 6.6.2008, 19:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 6.6.2008, 22:59
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 68
Регистрация: 6.6.2008
Из: Saint-Petersburg
Пользователь №: 194

Спасибо сказали: 1 раз(а)




Репутация:   3  


Для того чтобы получить текущию строку :
QTextBlock Block = textCursor().block();
const QString sText = Block.text();


А для добавления новой строки в место после курсора, лучше использовать QTextCursor::insertBlock().

Сообщение отредактировал Red Devil - 6.6.2008, 23:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 7.6.2008, 12:48
Сообщение #10


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Red Devil, большое спасибо, то что нужно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 0:39