crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QSyntaxHighlighter?
XXL
  опции профиля:
сообщение 5.7.2009, 12:12
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 30
Регистрация: 26.4.2009
Пользователь №: 708

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго дня!)
Подскажите,пожалуйста,как решить такую проблему. У меня есть текстовый редактор с возможностью разметки различных документов (C++ и т.д.) , а так же с режимом без разметки.
Ввожу текст, а затем применяю нужную подсветку, через QSyntaxHihglighter как в Qtшном примере

m_pHighlighter = new CSpmHighlighter(m_pText->document()); 
...
CSpmHighlighter::CSpmHighlighter(QTextDocument* pParent) : QSyntaxHighlighter(pParent)
{
   ...
}


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

// Получение курсора
QCursor widgCursor = ((QWidget*)pObject)->cursor();

// Получение текстового курсора
QTextCursor txtCursor = cursorForPosition(((QWidget*)pObject)->mapFromGlobal(widgCursor.pos()));

// Формирование формата символов текста
QTextCharFormat charFormat = txtCursor.charFormat();


то получаю тот текстовый формат, который использовался при вводе текста, а не тот который используется в настоящий момент в разметке.
После того, как удаляю m_pHighlighter, то разметка пропадает, а документ возвращается в исходное состояние.
В общем, я так понимаю, удаляется экземпляр QTextDocument, который использовался для разметки классом QSyntaxHighlighter. Но можно ли получать нужный текстовый формат, соответствующий формату подсветки, а не исходный, и как избежать возвращения разметки текста к первоначальному состоянию? Отказаться от QSyntaxHighlighter и реализовать свою функцию?
--------------------------------------
Еще такой вопрос, не совсем в тему, как написать регулярное выражение для разметки строк? То, которое используется во всех примерах, не совсем корректное ".*" - а именно если в тексте есть текст "строка1" не строка "строка2", то, соответственно, ко всему тексту применится нужный формат разметки, а нужно лишь к "строка1" и "строка2". Или придется пользоваться методом разметки, как для многострочных комментариев? (Что-то типа

         QTextCharFormat multiLineCommentFormat;
         multiLineCommentFormat.setForeground(Qt::red);

         QRegExp startExpression("/\\*");
         QRegExp endExpression("\\* /");

         setCurrentBlockState(0);

         int startIndex = 0;
         if (previousBlockState() != 1)
             startIndex = text.indexOf(startExpression);

         while (startIndex >= 0) {
            int endIndex = text.indexOf(endExpression, startIndex);
            int commentLength;
            if (endIndex == -1) {
                setCurrentBlockState(1);
                commentLength = text.length() - startIndex;
            } else {
                commentLength = endIndex - startIndex
                                + endExpression.matchedLength();
            }
            setFormat(startIndex, commentLength, multiLineCommentFormat);
            startIndex = text.indexOf(startExpression,
                                      startIndex + commentLength);
         }
)


Большое спасибо!)

Сообщение отредактировал Admin - 5.7.2009, 14:23
Причина редактирования: Учимся использовать тег CODE
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 3:56