Russian Qt Forum
Мая 04, 2025, 02:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Выделение текста в QTextEdit и установка курсора  (Прочитано 22542 раз)
Red Devil
Гость
« : Июня 05, 2008, 21:03 »

Можно ли каким-нибудь образом выделить текст и переместить курсор в нужное место ?
Просто проблема в том, что при установке курсора ему всегда нужно указывать MoveAcnhor или Keep - первое либо сбрасывает выделение, второне ее сохраняет от текущей позиции.
Т.е. чтобы я не сделал, курсор всегда будет либо в конце выделенного текста, либо в начале - а мне нужно в custom позиции. Можно ли это как-нибудь сделать ?
Записан
uriel
Гость
« Ответ #1 : Июня 05, 2008, 21:31 »

Смотрите в сторону методов QTextEdit
Код:
QTextCursor textCursor () const
void setTextCursor ( const QTextCursor & cursor )
Записан
Red Devil
Гость
« Ответ #2 : Июня 06, 2008, 10:36 »

Ты не понял проблему.
Как установить курсор - я знаю. Я знаю как выделить текст. Я знаю как установить позицию.
Проблема в том что при выделении текста я не знаю как задать позицию курсора. Потому как она либо в начале выделения должна быть либо в конце. Если после выделения текста, установить курсор в другое место - то либо выделится другой текст (keep acnhor), либо выделение вообще очисистится (move achor).
Но например если выделить весь текст (Ctrl+A) - то курсор остается на том же месте, на котором он и был - вот это мне и нужно.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июня 06, 2008, 10:45 »

а выделять тебе не все надо?
Записан

Юра.
Red Devil
Гость
« Ответ #4 : Июня 06, 2008, 10:47 »

Нет, конечно - я же и пишу код, с различными видами помощи программисту для выделение блоков кода, как в CodeRush - инкрементальное выделение.
Кроме того я проверил - в Qt даже если все выделять - он в конец текста курсор помещает Грустный
В KDevelop, например, он остается на своем месте.
да и вообще плохо, что выделение спадает, когда двигаешь курсор ...
вот сделать бы так что оно никогда не спадало, пока что-нибудь другое не начнешь выделять или хоткеем его очистить.
« Последнее редактирование: Июня 06, 2008, 10:53 от Red Devil » Записан
Red Devil
Гость
« Ответ #5 : Июня 06, 2008, 11:12 »

Пока что единственный вариант вижу - исходники Qt подправить, чтобы доступ к QTextCursorPrivate был, через него кажись можно установить позицию не теряя выделение ...

блин кажись я дятел :
Цитировать
QTextCursor::NoMove 0 - Keep the cursor where it is
Попробую эту штуку. Самое интересное, что нашел я ее в исходниках, а уже потом в ассистанте Улыбающийся

Ага два раза, это MoveOperation, а не MoveMode ... придется все таки исходник править.
Вот же нелюди, не могли сразу protected сделать ...
« Последнее редактирование: Июня 06, 2008, 11:37 от Red Devil » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #6 : Июня 06, 2008, 13:50 »

Пока что единственный вариант вижу - исходники Qt подправить, чтобы доступ к QTextCursorPrivate был, через него кажись можно установить позицию не теряя выделение ...

блин кажись я дятел :
Цитировать
QTextCursor::NoMove 0 - Keep the cursor where it is
Попробую эту штуку. Самое интересное, что нашел я ее в исходниках, а уже потом в ассистанте Улыбающийся

Ага два раза, это MoveOperation, а не MoveMode ... придется все таки исходник править.
Вот же нелюди, не могли сразу protected сделать ...

Исходники править - последнее дело.
Попробуй при выделении все операции выполнять от конца выделения к его началу.
Записан
Red Devil
Гость
« Ответ #7 : Июня 06, 2008, 14:35 »

Я уже эту ситуацию описывал.
Это без разницы откуда выделять. Если с конца - то курсор будет вначале выделения, если с начала - то в конце выделения. И если его еще раз потом установить в какую-нибудь позицию - то все выделение слетает.

Так же еще очень сильно бесит, то что выделение слетает если начал перемещать курсор. В VS например, пока текст не начнешь выделять - старое выделение будет активно, а тут шаг влево, впрво - расстрел, прыжок вниз/вверх - попытка улететь (Ширли-Мырли).

Ну исходник править - это я всмысле сделать QTextCursorPrivate - поменять область видимости private на protected, чтобы у меня к нему был доступ. Т.к. у меня все равно свой класс курсора унаследованный от QTextCursor, я бы в нем тогда смогу на низком уровне позицию устанавливать, без срасывания выделения. Насколько я понял по исходных кодам, в QTextCursorPrivate это можно сделать.
« Последнее редактирование: Июня 06, 2008, 14:43 от Red Devil » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #8 : Июня 06, 2008, 19:03 »

Не надо в данном случае связываться со стандартными средствами выделения QTextEdit.
У QTextEdit есть viewport()
Используй viewport()->update(); и в переопределенном paintEvent нарисуй свое выделение.
Можешь это делать ( viewport()->update() ) по любому нужному тебе алгоритму.
Ниже привден пример для выделения текущей строки в текстовом редакторе от QTextEdit.
Я ее вызываю по своему сигналу при изменении текущей строки.
То есть рисуй свое выделение на viewport TextEdit.

И не изменяй код QT. Когда нибудь с этим залетишь.

void TextEdit::paintEvent ( QPaintEvent * event )
{
   QPainter painter( viewport() );
   if ( CurrentLineVisible && CurrentLineColor.isValid() )
   {
      QRect r = cursorRect();
      r.setX( 0 );
      r.setWidth( viewport()->width() );
      painter.fillRect( r, QBrush( CurrentLineColor ));
   }      
   QTextEdit::paintEvent( event );
}
Записан
Red Devil
Гость
« Ответ #9 : Июня 06, 2008, 20:00 »

 :-Xвсе это конечно хорошо и идеально подоходит для выделение текущей строки (я собственно сделал похоже только добавил выбор еше чтобы не цветом строка заполнять а в рамку из dot/dash как это в VAX сделано), только мне нужно не выделение цветом - а физическое выделение, чтобы можно было нажать copy, чтобы скопировать текст, tab чтобы сделать индендинг для выделенных строк, при нажатии на хоткей конбинации весь выделенный текст удалялся бы - ну вообщем это все далеко не тоже самое.

Сейчас я подумал, что можно попробовать все это сделать с помощью ExtraSelections - сейчас его буду мучать. Конечно придется много кода сервисного писать - ну что поделать ...

пока чего ничего не получается - не выделяет он текст с помощью ExtraSelection ...

Что-то начало получится, по крайне мере видимость уже задал - нужно еще научить чтобы этот текст был теперь активным при манипулировании.
Никто не подскажет как можно получить цвета по умолчанию, которые используются при выделении текста ? Я имею в виду цвет шрифта в системе и цвет фона для выделенного текста ?
Даже можно упростить задачу - как получить цвет шрифта и фона, которые использует QTextCursor ?

Пока что сделал вот так :
Код:
typedef QTextEdit::ExtraSelection	ExtraSelection;
typedef QList<ExtraSelection> ExtraSelectionList;
ExtraSelectionList m_Selection;

void OnSelectionChanged()
{
           QTextCursor cursor = textCursor();
if (cursor.hasSelection())
{
m_Selection.begin()->cursor = cursor;
m_Selection.begin()->format.setBackground(QBrush(Qt::black));
m_Selection.begin()->format.setForeground(QBrush(Qt::white));
setExtraSelections(m_Selection);
}
}
В m_Selection только 1 элемент ExtraSelection, в конструкторе добавляю.
« Последнее редактирование: Июня 06, 2008, 20:59 от Red Devil » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #10 : Июня 06, 2008, 21:31 »

:-Xвсе это конечно хорошо и идеально подоходит для выделение текущей строки (я собственно сделал похоже только добавил выбор еше чтобы не цветом строка заполнять а в рамку из dot/dash как это в VAX сделано), только мне нужно не выделение цветом - а физическое выделение, чтобы можно было нажать copy, чтобы скопировать текст, tab чтобы сделать индендинг для выделенных строк, при нажатии на хоткей конбинации весь выделенный текст удалялся бы - ну вообщем это все далеко не тоже самое.

Сейчас я подумал, что можно попробовать все это сделать с помощью ExtraSelections - сейчас его буду мучать. Конечно придется много кода сервисного писать - ну что поделать ...

пока чего ничего не получается - не выделяет он текст с помощью ExtraSelection ...

Что-то начало получится, по крайне мере видимость уже задал - нужно еще научить чтобы этот текст был теперь активным при манипулировании.
Никто не подскажет как можно получить цвета по умолчанию, которые используются при выделении текста ? Я имею в виду цвет шрифта в системе и цвет фона для выделенного текста ?
Даже можно упростить задачу - как получить цвет шрифта и фона, которые использует QTextCursor ?

Пока что сделал вот так :
Код:
typedef QTextEdit::ExtraSelection	ExtraSelection;
typedef QList<ExtraSelection> ExtraSelectionList;
ExtraSelectionList m_Selection;

void OnSelectionChanged()
{
           QTextCursor cursor = textCursor();
if (cursor.hasSelection())
{
m_Selection.begin()->cursor = cursor;
m_Selection.begin()->format.setBackground(QBrush(Qt::black));
m_Selection.begin()->format.setForeground(QBrush(Qt::white));
setExtraSelections(m_Selection);
}
}
В m_Selection только 1 элемент ExtraSelection, в конструкторе добавляю.

Кто мешает сохранить выделенное цветом и переопределить операцию копирования?
Записан
Red Devil
Гость
« Ответ #11 : Июня 06, 2008, 21:50 »

Никто не мешает, это техническая сторона. Мешает то что я цветов не знаю - я сделал черный и белый для выделения, но у меня в системе это другие цвета. В линуксе эти цвета тоже настраиваюся в DM, вот и я их хочу как-нибудь получить чтобы выделять таким же цветом.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #12 : Июня 07, 2008, 07:37 »

Никто не мешает, это техническая сторона. Мешает то что я цветов не знаю - я сделал черный и белый для выделения, но у меня в системе это другие цвета. В линуксе эти цвета тоже настраиваюся в DM, вот и я их хочу как-нибудь получить чтобы выделять таким же цветом.

Все что тебе нужно в QPalette. Там все цвета для всех состояний - Active, Inactive, Disabled.
QPalette в твоем случае от QTextEdit

The QPalette class contains color groups for each widget state.
A palette consists of three color groups: Active, Disabled, and Inactive. All widgets in Qt contain a palette and use their palette to draw themselves. This makes the user interface easily configurable and easier to keep consistent.
If you create a new widget we strongly recommend that you use the colors in the palette rather than hard-coding specific colors.
The color groups:
The Active group is used for the window that has keyboard focus.
The Inactive group is used for other windows.
The Disabled group is used for widgets (not windows) that are disabled for some reason.
Записан
Red Devil
Гость
« Ответ #13 : Июня 07, 2008, 09:42 »

Mikhail - Спасибо, то что нужно.
Странно что по запросу system color, ассистант не выводит на этот класс.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #14 : Июня 07, 2008, 11:35 »

Mikhail - Спасибо, то что нужно.
Странно что по запросу system color, ассистант не выводит на этот класс.

Ну и правильно, что не выводит. Это же не системный цвет. И даже не цвет, а палитра - совокупность цветовых характеристик для различных состояний. Пожелание - не стремись корежить исходники Qt. Там не один человек работал. Наследуй, наследуй и еще раз наследуй.... Успехов.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.02 секунд. Запросов: 19.