Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: перемещение курсора в QTextEdit
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
void*
добрый день! есть вопрос:
как сделать чтобы если в QTextEdit'е ввели символ { или : и нажали Enter, то курсор перемещается не в начало следующей строки, а на следующую строку и под этим символом?
заранее большое спасибо!
ViGOur
Примерно так:
#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*
1)QTextEdit::toPlainText() по-моему получает весь текст из области, можно ли как-то получать только одну данную линию текста?
2)в моем случае скорее надо вместо QString::right() использовать QString::left(), т.к. когда Ентер нажат, то символ уже введен...
3)может проще сделать через keyPressEvent?
вообще, пример того, что я хочу сделать - есть в любой IDE, но я чего-то путаюсь с передвиганием курсора
ViGOur
Критика конечно же обоснована, но я это набросал как пример для наглядности того, как сделать то, что ты хочешь. Потому оптимизацией занимайся как-нибудь сам... ;)

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


Цитата(void* @ 5.6.2008, 13:50) *
но я чего-то путаюсь с передвиганием курсора
Что именно не понятно?
void*
ладно, чуть позже еще пошаманю над этим
void*
ViGOur, и все-таки можно ли как-то получить только последнюю строку или, что еще лучше, символ, а не весь текст, как здесь у тебя:
QString szText = toPlainText();

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

параллельно роюсь в ассистенте...
З.Ы. насчет второго пункта я был неправ, неправильно понял работу этой функции
void*
уррряя! получилось :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*
немного усовершенствовал:
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 - целочисленная переменная, хранящаяся в классе и инициализирущаяся в конструкторе для начала нулем)
Red Devil
Для того чтобы получить текущию строку :
QTextBlock Block = textCursor().block();
const QString sText = Block.text();


А для добавления новой строки в место после курсора, лучше использовать QTextCursor::insertBlock().
void*
Red Devil, большое спасибо, то что нужно
Marsel - Adaeze
Добрый вечер, изучаю работу с файлами в QT Creator, стоит такая задача: в файл записываются: марка мобильного телефона, вес в граммах и цена. пользователь задаёт минимальную и максимальную цены и на экран должны вывестись телефоны, цены которых входят в заданный промежуток, как можно осуществить данную сортировку с использованием QTextCursor, вот, допустим, вывод у меня осуществляется в таком формате: sony3s22rw|500|10000|, я выгружаю всю информацию из файла в текст эдит, заставляю элемент типа QTextCursor искать в строке каждый второй символ "|", а как вот дальше заставить его переместиться наследующую позицию и выделить слово? И сразу вопрос, можно ли выделенную часть переводить в число и проверять на соответствие условию, в Delphi вроде бы так можно было делать, не приходилось особо это затрагивать, когда работала там, а вот тут что-то пришлось.
OKTA
Может не стоит мучиться с файлами? Чем sqlite не угадила?
lanz
А вместо QTextEdit использовать таблицу, например QTableView.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.