LINUX.ORG.RU

QTextEdit: Как заполучить «универсальное» событие вставки символа?

 , ,


0

1

В свете отсутсТвия решения в теме QTextEdit: Как «отцепиться» от ссылки?, заменяю задачу.

Мне нужно отловить событие вставки символа в текст в объекте, унаследованном от QTextEdit.

Проблема осложняется тем, что символы могут вставляться, как минимум, тремя путями:

- Нажатием клавиши на клавиатуре;
- Вставкой из буфера обмена;
- Drag-and-drop текста.

Возможно, что еще есть методика вставки символа, пока припомнил только три. Ну еще плюсом идет удаление символа или выделения, тогда под курсором начинает находиться другой символ.

Из-за этого, тупое переопределение keyPressEvent() - этого явно недостаточно. Неужели надо лепить развесистые ловители событий и сигналов только для того, чтобы получить событие вставки символа?

★★★★★

void QTextDocument::contentsChange(int position, int charsRemoved, int charsAdded) [signal]

This signal is emitted whenever the document's content changes; for example, when text is inserted or deleted, or when formatting is applied.

Information is provided about the position of the character in the document where the change occurred, the number of characters removed (charsRemoved), and the number of characters added (charsAdded).

The signal is emitted before the document's layout manager is notified about the change. This hook allows you to implement syntax highlighting for the document.

Чем не подходит?

XMs ★★★★★ ()
Ответ на: комментарий от XMs

Кстате, про QTextDocument я как-то не подумал.

Начал колхозить с cursorPositionChanged(). Щас подумаю, что лучше...

Xintrea ★★★★★ ()
Ответ на: комментарий от XMs

Меня в contentsChange вот что смущает:

The signal is emitted before the document's layout manager is notified about the change.

То есть, он вызывается до того, как изменения прокинутся в QTextEdit?

Xintrea ★★★★★ ()
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от XMs

Да, что-то непонятное творится. Пробую в обработчике вот так:

  ...
  // Если последний символ не является пробелом или символом-разделителем
  if( !prevCharacter.isSpace() )
    return;

  // Здесь выяснено, что введен пробел или TAB или перевод строки...

  // Дополнительный курсор снова устанавливается на начальную позицию
  cursor.setPosition(cursorPosition);

  // Форматирование предыдущего, текущего и последующего символа
  QTextCharFormat formatPreviousChar;
  QTextCharFormat formatCurrentChar;
  QTextCharFormat formatNextChar;

  // Выясняется форматирование текущего символа
  formatCurrentChar=cursor.charFormat();

  // Выясняется форматирование предыдущего символа
  cursor.movePosition(QTextCursor::PreviousCharacter);
  formatPreviousChar=cursor.charFormat();

  // Выясняется форматирование последующего символа
  cursor.movePosition(QTextCursor::NextCharacter);
  cursor.movePosition(QTextCursor::NextCharacter);
  formatNextChar=cursor.charFormat();

  // Если предыдущий и текущий сивол имеют форматирование ссылки, а последующий - обычный
  if(formatPreviousChar.isAnchor() && formatCurrentChar.isAnchor() && !formatNextChar.isAnchor())
  {
    // Текущий символ (пробел/TAB/ПС) становится обычным
    formatCurrentChar.setAnchor(false);
    formatCurrentChar.setFontWeight(QFont::Bold); // Для отладки

    // Дополнительный курсор снова устанавливается на начальную позицию
    cursor.setPosition(cursorPosition);
    cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);

    cursor.mergeCharFormat(formatCurrentChar);
  }


Отладчик входит внутрь условия, форматирование вроде как применяется. Но последний символ как был ссылкой так и остается. И форматирование жирным не наблюдается. Не пойму почему.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

То есть, он вызывается до того, как изменения прокинутся в QTextEdit?

Да.

Отладчик входит внутрь условия, форматирование вроде как применяется. Но последний символ как был ссылкой так и остается

Я бы в таком случае проверил, куда именно оно применяется, применяется ли на самом деле и не нужно ли уведомить виджет или QTextDocument об изменениях. Сам с этим пока не работал, поэтому более конкретных советов дать не могу

XMs ★★★★★ ()
Ответ на: комментарий от Xintrea

contentsChange() до
contentsChanged() после

Не лазь в потроха, в contentsChange() запомни интервал вставки, а в contentsChanged() или даже позже (асинком) переформатируй этот кусок, если надо.

ps. ну и кусок же этот qt, и чего с ним все так носятся?

arturpub ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.