Russian Qt Forum
Ноябрь 25, 2024, 15:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Вставка ссылки в QTextEdit  (Прочитано 9412 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 05, 2016, 02:49 »

Имеется объект textArea - представитель класса QTextEdit.

Я пытаюсь сделать из выделенного фрагмента HTML-ссылку (URL ссылки в переменной refereceUrl):

Код:
  // Устанавливается текст ссылки
  QTextCharFormat charFormat;
  charFormat.setAnchorHref(refereceUrl);

  // Если текст ссылки задан
  if(refereceUrl.length()>0)
  {
    charFormat.setAnchor(true);
    textArea->textCursor().mergeCharFormat(charFormat);
  }
  else
  {
    // Иначе текст ссылки пустой и ссылку надо убрать
    charFormat.setAnchor(false);
    textArea->textCursor().setCharFormat(charFormat);
  }

Ссылка устанавливается, но визуально текст не меняется (выделенный фрагмент не становится синим с подчеркиванием).

Единственный способ увидеть созданную ссылку - это взять текст textArea.html и снова его установить через textArea.setHtml(html). Но это я считаю слишком дорогостоящим решением.

Самое интересное, что убирание ссылки работает правильно (если устанавливаемая ссылка пустая, то синий цвет и подчеркивание убираются). А именно установка ссылки визуально работает криво - не появляется синего цвета и подчеркивания.

Я грешил на разницу между mergeCharFormat() и setCharFormat(), но толку никакого, что ни пиши, ссылка визуально не отображается.

« Последнее редактирование: Январь 07, 2016, 02:18 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 05, 2016, 20:31 »

А через вставку html пробовали?
Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Январь 05, 2016, 21:03 »

А через вставку html пробовали?

Тут дело в другом. Есть обычный абзац с текстом (привожу HTML-код):

Код:
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Тут есть текст.</p>

Выделяю слово "есть", нажимаю кнопку и это слово становится ссылкой (оборачивается тегом <a href="..."> через применение setAnchor(true) и setAnchorHref()), которая визуально смотрится как обычное слово:

Код:
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Тут <a href="https://link.ru">есть</a> текст.</p>

Сохраняю в память или на диск все HTML-содежимое QTextEdit. И снова засовываю в QTextEdit через setHtml(). При засовывании появляются дополнительные теги <span style="..."> в которых прописывается декорация ссылки:

Код:
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Тут <a href="https://link.ru"><span style=" text-decoration: underline; color:#0000ff;">есть</span></a> текст.</p>

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

Если я сделаю через HTML, и сам добавлю стилизацию "text-decoration: underline; color:#0000ff;" то нет никакой гарантии, что движок Qt в следующей версии не поменяет стилизацию, не станет добавлять самостоятельно этот стиль (получится дважды), не вылезут еще какие-нибудь эффекты.
« Последнее редактирование: Январь 05, 2016, 21:13 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Январь 05, 2016, 21:08 »

А через вставку html пробовали?

И еще. В документации написано:

Цитировать
void QTextCharFormat::setAnchor(bool anchor)
If anchor is true, text with this format represents an anchor, and is formatted in the appropriate way; otherwise the text is formatted normally. (Anchors are hyperlinks which are often shown underlined and in a different color from plain text.)

The way the text is rendered is independent of whether or not the format has a valid anchor defined. Use setAnchorHref(), and optionally setAnchorNames() to create a hypertext link.

Я этот setAnchor(true) и использую. Но то что выделено жирным не происходит. Точнее, происходит, но только после полной перезагрузки текста.

Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Январь 05, 2016, 21:17 »

А через вставку html пробовали?

Во, нашел. Проблема обнаружена в 2010 году и до сих пор не исправлена.

http://www.forum.crossplatform.ru/index.php?showtopic=4670&mode=linearplus
Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Январь 05, 2016, 21:39 »

А через вставку html пробовали?

Во, нашел. Проблема обнаружена в 2010 году и до сих пор не исправлена.

http://www.forum.crossplatform.ru/index.php?showtopic=4670&mode=linearplus

я через html вставлял и нормально было (https://github.com/gil9red/NotesManager):
Код
C++ (Qt)
void FormattingToolbar::on_insertHyperlink_clicked()
{
   if ( !editor )
       return;
 
   DialogInsertHyperlink dialog( this );
   dialog.setTextHyperlink( editor->textCursor().selectedText() );
   if ( !dialog.exec() )
       return;
 
   const QString & hyperlink = dialog.getHyperlink();
   const QString & text = dialog.getTextHyperlink();
 
   editor->insertHtml( QString( "<a href=\"%1\">%2</a> " ).arg( hyperlink ).arg( text ) );
}
 

editor -- QTextEdit
Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Январь 06, 2016, 01:32 »

Я сделал проще. Просто добавил две строчки:

Код:
charFormat.setForeground(QApplication::palette().color(QPalette::Link));
charFormat.setFontUnderline(true);

Баг старый, и на него никто не обращает внимания. Просто обходят вот так и все.

PS: А чего это твой NotesManager из master ветки не собирается:

Код:
./ui_page_notes.h:26:50: fatal error: NavigationPanel\datenavigationwidget.h: Нет такого файла или каталога
 #include "NavigationPanel\datenavigationwidget.h"
                                                  ^
compilation terminated.
Makefile:1162: ошибка выполнения рецепта для цели «Manager.o»

Да у тебя слеш в другую сторону...

Ага, компиляция пошла, затык на линковке:

Код:
RichTextNote.o: In function `RichTextNote::saveAs()':
RichTextNote.cpp:(.text+0xca38): undefined reference to `JlCompress::compressDir(QString, QString, bool)'
scriptsmanager.o: In function `ScriptsManager::on_actionRunScript_triggered()':
scriptsmanager.cpp:(.text+0xf66): undefined reference to `QsciScintilla::text() const'
scriptsmanager.o: In function `ScriptsManager::ScriptsManager(QWidget*)':
scriptsmanager.cpp:(.text+0x15bb): undefined reference to `QsciLexerJavaScript::QsciLexerJavaScript(QObject*)'
scriptsmanager.cpp:(.text+0x17d8): undefined reference to `QsciScintilla::setMatchedBraceBackgroundColor(QColor const&)'
scriptsmanager.cpp:(.text+0x17f6): undefined reference to `QsciScintilla::setUnmatchedBraceForegroundColor(QColor const&)'
scriptsmanager.o: In function `ScriptsManager::sl_ContentScriptChanged()':
scriptsmanager.cpp:(.text+0x2369): undefined reference to `QsciScintilla::text() const'
scriptsmanager.o: In function `Ui_ScriptsManager::setupUi(QMainWindow*)':
scriptsmanager.cpp:(.text._ZN17Ui_ScriptsManager7setupUiEP11QMainWindow[_ZN17Ui_ScriptsManager7setupUiEP11QMainWindow]+0x885): undefined reference to `QsciScintilla::QsciScintilla(QWidget*)'
main.o: In function `main':
main.cpp:(.text.startup+0xf4): undefined reference to `QtSingleApplication::QtSingleApplication(int&, char**, bool)'
main.cpp:(.text.startup+0x1b7): undefined reference to `QtSingleApplication::isRunning()'
main.cpp:(.text.startup+0x1ed): undefined reference to `QtSingleApplication::sendMessage(QString const&, int)'
main.cpp:(.text.startup+0x20d): undefined reference to `vtable for QtSingleApplication'
main.cpp:(.text.startup+0xe9c): undefined reference to `vtable for QtSingleApplication'
collect2: error: ld returned 1 exit status
Makefile:393: ошибка выполнения рецепта для цели «../bin/NotesManager»
make: *** [../bin/NotesManager] Ошибка 1

Что делать?
« Последнее редактирование: Январь 06, 2016, 01:36 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Январь 06, 2016, 02:35 »

После сборки QScintilla-gpl-2.8.1 и qt-solutions/qtsingleapplication не должно быть проблем Улыбающийся
Да и есть релизы для винды
Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Январь 06, 2016, 14:00 »

После сборки QScintilla-gpl-2.8.1 и qt-solutions/qtsingleapplication не должно быть проблем Улыбающийся

А где их брать? Как компилировать? Как подключать к твоему проекту чтобы твой проект собрался? У тебя ничего об этом в документации не написано.


Да и есть релизы для винды

Я под линух собираю.
« Последнее редактирование: Январь 06, 2016, 14:05 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Январь 06, 2016, 15:46 »

После сборки QScintilla-gpl-2.8.1 и qt-solutions/qtsingleapplication не должно быть проблем Улыбающийся

А где их брать? Как компилировать? Как подключать к твоему проекту чтобы твой проект собрался? У тебя ничего об этом в документации не написано.


Да и есть релизы для винды

Я под линух собираю.

Забейте на его сборку Улыбающийся
Готовилось под винду, было первым большим проектом, поэтому косяки есть, и я им защитил диплом, и после уже не возвращался к проекту Улыбающийся
А так, на сколько я помню, собирались qscintilla (для подсветки кода в редакторе скриптов), qtsingleapplication (поддержка запуска одного экземпляра приложения) и quazip (кажется, для сохранения заметок в виде одного файла). А после этого собирался NoteManager. После сборки тех трех, проблем с линковкой не должно возникать, теоретически Улыбающийся
« Последнее редактирование: Январь 06, 2016, 15:49 от gil9red » Записан

panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Январь 07, 2016, 00:30 »

Если хочется нормальный html редактор, то лучше смотреть в сторону sigil
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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