Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexmal от Октябрь 19, 2013, 12:03



Название: Разработка собственного IDE. Анализ кода.
Отправлено: alexmal от Октябрь 19, 2013, 12:03
Столкнулся с проблемой. нужно сделать анализ кода и определить, находиться ли курсор между {  }.
Если находиться, то выполнить определенное действия. Конечно можно смотреть в цикле до и после курсора,
но мне кажется, что это не оптимально и будет тормозить Gui. Класс который отвечает за текстовый редактор наследуется от QPlainTextEdit.


Название: Re: Разработка собственного IDE. Анализ кода.
Отправлено: Bepec от Октябрь 19, 2013, 13:33
Достойная идея :)

Ну как вариант тормозить такое не будет :)


Название: Re: Разработка собственного IDE. Анализ кода.
Отправлено: Hrundel от Октябрь 20, 2013, 13:09
У QCursor есть событие cursorPositionChanged (). Вот при каждом событии и надо проверять что справа, что слева.
Проблема только в количестве проверяемых знаков и их нахождении в строках. Если "{" стоит где-то в строке 12, а  "}" в строке 1234, и в каждой строке по 200-300 знаков, то игра, наверное, не стоит свеч.
Однако, можно попробовать написать так, что бы курсор "помнил" позиции знаков "{" и "}" и сверял свою. Просто написать два вектора один для "{", другой для "}"
Правда, в этом случае придется при каждом редактировании (например при нажатии клавиши "back") пересчитывать позиции для всех "{" и "}" (тупая арифметика) и проверять их на удаление (вруг этот "back" удалил знак из позиции, значит его надо и из вектора удалить). Но это будет значительно проще чем вариант с проверкой всех строк. По скорости будет в разы быстрее.


Название: Re: Разработка собственного IDE. Анализ кода.
Отправлено: Sasha от Ноябрь 01, 2013, 18:11
Столкнулся с проблемой. нужно сделать анализ кода и определить, находиться ли курсор между {  }.
Если находиться, то выполнить определенное действия. Конечно можно смотреть в цикле до и после курсора,
но мне кажется, что это не оптимально и будет тормозить Gui. Класс который отвечает за текстовый редактор наследуется от QPlainTextEdit.
Моё мнение, что если предполагается что-то навороченое, то лучше сразу задуматься о переносе всего анализа в отдельный поток, а то будет как в MSVisualStudio2010 (с другими кроме 6.0 не сталкивался), где при определённой сложности кода, начинает тормозить даже простое перемещение курсора, не говоря уже о редактировании. создаётся впечатление, что весь анализ работает в том же потоке что и GUI (если не так, то я вообще не знаю что это такое).
Чтобы в фоновом потоке не начинать анализ всего текста при каждой модификации, можно перепосылать все события относящиеся к редактированию текста из основного потока в этот фоновый.