LINUX.ORG.RU

QTextCursor + QTextCharFormat + QTextBlock


0

0

Задача такая: надо в QTextBrowser поместить несколько ссылок, впоследствии которые потом необходимо преврать в обычный текст (как вариант, просто обнулить href)

Вот один из вариантов кода:

   QTextBlockFormat tbf = cursor.blockFormat();

   QTextCharFormat tf;

   tf.setAnchor(true);

   tf.setAnchorHref(«sdfgh»);

   /*Создаём текстовые блоки с текстом, который является гиперссылкой*/

   cursor.insertBlock();

   cursor.blockCharFormat().setAnchor(true);

   cursor.blockCharFormat().setAnchorHref(«sghj»);

   cursor.insertText(«Comm1»);

   /*И щё один*/

   cursor.insertBlock();

   cursor.blockCharFormat().setAnchor(true);

   cursor.blockCharFormat().setAnchorHref(«sghj»);

   cursor.insertText(«Comm2»);

   /*Дальше мы ссылки в данных блоках пытаемся обнулить*/

   tf.setAnchor(false);

   tf.setAnchorHref("");

   QTextBlock tb = cursor.block();

   cursor.setPosition(tb.position());

   if (cursor.blockCharFormat().isAnchor()) //Вот тут условие срабатывает, и срабатывает верно

      cursor.mergeBlockCharFormat(tf);

   tb = tb.previous();

   cursor.setPosition(tb.position());

   if (cursor.blockCharFormat().isAnchor()) //Тут тоже

      cursor.mergeBlockCharFormat(tf);

Вариантов перепробовал много. Проблема в том, что в половине из них в первой части кода ссылки на текст просто не устанавливаются. В приведённом выше варианте они вроде становятся, однако формат самих етих ссылок отличается от тех, которые были бы, если б я сделал cursor.insertHtml(«sghj»). то есть, они не синего цвета и не подчёркнуты.

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

Важно, что ссылки не являются ссылками http:// - у меня они выполняют внутренние программные функции. Обрабатывать их пробовал - а етом проблемы нету.

1. Вид ссылок можно задать в самом формате. По-видимому, setHtml сам задает синеву и подчеркивание 2. У QTextCharFormat есть метод setAnchorNames. Не пробовал текст ссылки с помощью него задавать? 3. Подозрение такое, что ты устанавливаешь blockCharFormat, а он влияет только на вставку текста в начало блока. По идее, нужно выделить текст ссылки, и для этого выделения вызвать setCharFormat. Хотя, если setAnchorNames работает, как я предполагаю, достаточно будет выделять только один символ. Возможно, это должен быть специальный символ типа QChar::ObjectReplacementCharacter

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

> По-видимому, setHtml сам задает синеву и подчеркивание

Что-то не нахожу в документации метод. У какого класса он присутствует?

У QTextCharFormat есть метод setAnchorNames. Не пробовал текст ссылки с помощью него задавать?

Может, глупый вопрос, но я не понял, кто такие names и какова их суть..

По идее, нужно выделить текст ссылки, и для этого выделения вызвать setCharFormat

Пробовал и setCharFromat, но тогда он просто не находит второго блока... Вернее, может и находит, но устанавливая setAnchor(false) второе условие не выполнится. То есть свойство anchor потеряется и у ссылки сторого блока. Хотя, ето мои догадки.. Попробую щё выделить один символ ссылки. Мож правда получится..

abr_linux
() автор топика
Ответ на: комментарий от abr_linux

> Что-то не нахожу в документации метод. У какого класса он присутствует?

ошибся же, insertHtml имел в виду

Может, глупый вопрос, но я не понял, кто такие names и какова их суть..

похоже это не то, что нужно, кажется они для закладок в документе могут использоваться

Попробую щё выделить один символ ссылки. Мож правда получится..

по идее надо всю ссылку выделять, причем именно как текст, а не блок

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

Ура! Получилось вот так:

QTextBlockFormat tbf = cursor.blockFormat();

QTextCharFormat tf;

cursor.insertBlock();

//Вставляем ссылки одной строкой

cursor.insertHtml(«<a href=\„abc\“>one</a>\t<a href=\„def\“>two</a>\t<a href=\„ghi\“>three</a>»);

...

//обнуляем ссылки

tf.setAnchor(false);

tf.setAnchorHref("");

QTextBlock tb = cursor.block();

cursor.setPosition(tb.position());

if (cursor.charFormat().isAnchor())

{

cursor.select(QTextCursor::LineUnderCursor);

cursor.setCharFormat(tf);

}

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