Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Red Devil от Июня 05, 2008, 21:03



Название: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 05, 2008, 21:03
Можно ли каким-нибудь образом выделить текст и переместить курсор в нужное место ?
Просто проблема в том, что при установке курсора ему всегда нужно указывать MoveAcnhor или Keep - первое либо сбрасывает выделение, второне ее сохраняет от текущей позиции.
Т.е. чтобы я не сделал, курсор всегда будет либо в конце выделенного текста, либо в начале - а мне нужно в custom позиции. Можно ли это как-нибудь сделать ?


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: uriel от Июня 05, 2008, 21:31
Смотрите в сторону методов QTextEdit
Код:
QTextCursor textCursor () const
void setTextCursor ( const QTextCursor & cursor )


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 06, 2008, 10:36
Ты не понял проблему.
Как установить курсор - я знаю. Я знаю как выделить текст. Я знаю как установить позицию.
Проблема в том что при выделении текста я не знаю как задать позицию курсора. Потому как она либо в начале выделения должна быть либо в конце. Если после выделения текста, установить курсор в другое место - то либо выделится другой текст (keep acnhor), либо выделение вообще очисистится (move achor).
Но например если выделить весь текст (Ctrl+A) - то курсор остается на том же месте, на котором он и был - вот это мне и нужно.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: lit-uriy от Июня 06, 2008, 10:45
а выделять тебе не все надо?


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 06, 2008, 10:47
Нет, конечно - я же и пишу код, с различными видами помощи программисту для выделение блоков кода, как в CodeRush - инкрементальное выделение.
Кроме того я проверил - в Qt даже если все выделять - он в конец текста курсор помещает :(
В KDevelop, например, он остается на своем месте.
да и вообще плохо, что выделение спадает, когда двигаешь курсор ...
вот сделать бы так что оно никогда не спадало, пока что-нибудь другое не начнешь выделять или хоткеем его очистить.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 06, 2008, 11:12
Пока что единственный вариант вижу - исходники Qt подправить, чтобы доступ к QTextCursorPrivate был, через него кажись можно установить позицию не теряя выделение ...

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

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


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Mikhail от Июня 06, 2008, 13:50
Пока что единственный вариант вижу - исходники Qt подправить, чтобы доступ к QTextCursorPrivate был, через него кажись можно установить позицию не теряя выделение ...

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

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

Исходники править - последнее дело.
Попробуй при выделении все операции выполнять от конца выделения к его началу.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 06, 2008, 14:35
Я уже эту ситуацию описывал.
Это без разницы откуда выделять. Если с конца - то курсор будет вначале выделения, если с начала - то в конце выделения. И если его еще раз потом установить в какую-нибудь позицию - то все выделение слетает.

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

Ну исходник править - это я всмысле сделать QTextCursorPrivate - поменять область видимости private на protected, чтобы у меня к нему был доступ. Т.к. у меня все равно свой класс курсора унаследованный от QTextCursor, я бы в нем тогда смогу на низком уровне позицию устанавливать, без срасывания выделения. Насколько я понял по исходных кодам, в QTextCursorPrivate это можно сделать.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Mikhail от Июня 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 );
}


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 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, в конструкторе добавляю.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Mikhail от Июня 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, в конструкторе добавляю.

Кто мешает сохранить выделенное цветом и переопределить операцию копирования?


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 06, 2008, 21:50
Никто не мешает, это техническая сторона. Мешает то что я цветов не знаю - я сделал черный и белый для выделения, но у меня в системе это другие цвета. В линуксе эти цвета тоже настраиваюся в DM, вот и я их хочу как-нибудь получить чтобы выделять таким же цветом.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Mikhail от Июня 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.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 07, 2008, 09:42
Mikhail - Спасибо, то что нужно.
Странно что по запросу system color, ассистант не выводит на этот класс.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Mikhail от Июня 07, 2008, 11:35
Mikhail - Спасибо, то что нужно.
Странно что по запросу system color, ассистант не выводит на этот класс.

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


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 07, 2008, 11:44
Так я наследую ^_^
Просто не понимаю, почему не сделали PrivateCursor protected, через него все операции идут с помощью которых гораздо больше возможностей, нежели чем через интерфейс.

Ну кстати в Qt тоже не все хорошо - я вот нашел в их исходниках просто тупейшие копи-пасты ^_^
qtextcontrol.cpp строка 200, там еще пониже еще есть.

Цитировать
Ну и правильно, что не выводит. Это же не системный цвет. И даже не цвет, а палитра - совокупность цветовых характеристик для различных состояний.
Но все таки они берутся из настроек системы - поэтому я считаю, что это системные цвета. И в WINAPI функция для получения состояния этих цветов так и называется systemColor чего-то там.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Mikhail от Июня 07, 2008, 12:08
Так я наследую ^_^
Просто не понимаю, почему не сделали PrivateCursor protected, через него все операции идут с помощью которых гораздо больше возможностей, нежели чем через интерфейс.

Ну кстати в Qt тоже не все хорошо - я вот нашел в их исходниках просто тупейшие копи-пасты ^_^
qtextcontrol.cpp строка 200, там еще пониже еще есть.

Цитировать
Ну и правильно, что не выводит. Это же не системный цвет. И даже не цвет, а палитра - совокупность цветовых характеристик для различных состояний.
Но все таки они берутся из настроек системы - поэтому я считаю, что это системные цвета. И в WINAPI функция для получения состояния этих цветов так и называется systemColor чего-то там.

Ну по приватному курсору - это вопрос к троллям.

В конечном итоге не из системы.
Создай два или более QTextEdit и настрой для них разные палитры.


Название: Re: Выделение текста в QTextEdit и установка курсора
Отправлено: Red Devil от Июня 07, 2008, 13:47
Ну настроить - то не проблема конечно :-)
Я же говорю про значения, которые палитра получают по умолчанию - вот они то из системных настроек.
Ну ладно я думаю пора кончать флеймить.
Вопрос впринципе открыт - если кто-нибудь знает как можно стандарными средствами QTextCursor выделить текст и чтобы курсор остался на своем месте : пишете. Хотя я в этом сомневаюсь, пересмотрев assistant я не нашел способа. Возможно в будующих версия QT добавят - очень бы хотелось.

Пока что самый лучшим вариантом мне кажется использование ExtraSelection. Делаем 1 штуку и устанавливаем ему выделение курсора и для format цвета дефолтные, которые из палитры можно взять. Нужно только учесть, что нужно переопределить операции копирования и других конбинаций клавиш которые влияют на выделенный текст, т.к. нужно работать с текстом именно в ExtraSelection обьекте.