QScintilla: подсвечиваем синтаксис в приложении

в 17:07, , рубрики: linux, qscintilla, qt, Qt Software, Ubuntu, Программирование, метки: , , ,

Привет, $username!

Сегодня я хочу рассказать вам про отличный проект — QScintilla, который подсвечивает синтаксис кода в Qt-приложениях. Нередко возникает необходимось что-то подсвечивать. Например: C++, Bash, PHP, Diff… Этот список можно продолжать и продолжать. Но вот решение: порт Scintilla на Qt: QScintilla.

В этом посте я расскажу как установить и пользоваться QScintilla в своих приложениях на примере Ubuntu Linux.

Установка

Начнем, пожалуй, с самого главного — с установки. Предлагаю собрать QScintilla и установить ее в систему. Для этого скачаем тарбол qscintilla. Распаковываем его в нужную нам папку. Теперь консолька. Выполняем пару нехитрых комманд:

cd Qt4
qmake
make
sudo make install

Отличненько. Если вы все сделали правильно, у вас в системе появиться libqscintilla2.so

Открываем Qt Creator

Ура! Можно начинать кодить. Открывааем криейтор — создаем проект. Теперь добавляем в профайл строчку:

LIBS += -lqscintilla2

Несложно догадаться что эта строчка подключает QScintilla. Теперь перейдем непосредственно к кодингу проекта. Конструктор mainwindow.cpp:

#include <QtGui>

#include <Qsci/qsciscintilla.h>
#include <Qsci/qscilexercpp.h>

#include "mainwindow.h"

MainWindow::MainWindow()
{
    textEdit = new QsciScintilla; // инитилизируем редактор
    textEdit->setUtf8(true); // мы же хотим читать кириллицу
    setCentralWidget(textEdit); // задаем редактор в ui
    QsciLexerCPP * lexCpp = new QsciLexerCPP(this); // создаем лексер (схему подсветки)
    textEdit->setLexer(lexCpp); // задаем С++ лексер нашему редактору
}

Не забываем добавить в MainWindow:

private:
    QSciScintilla *textEdit;

Можно смело компилировать — мы видим редактор который подсвечивает C++ код на ура.

QScintilla: подсвечиваем синтаксис в приложении

Пока это не выглядит очень круто, но это только пока. А теперь начинаеться самое интересное. Предлагаю расширить наш редактор и украсить его. Дописываем в конструктор:

    //! Текущая строка кода и ее подсветка
    textEdit->setCaretLineVisible(true);
    textEdit->setCaretLineBackgroundColor(QColor("gainsboro"));

    //! Выравнивание
    textEdit->setAutoIndent(true);
    textEdit->setIndentationGuides(false);
    textEdit->setIndentationsUseTabs(true);
    textEdit->setIndentationWidth(4);

    //! margin это полоска слева, на которой обычно распологаются breakpoints
    textEdit->setMarginsBackgroundColor(QColor("gainsboro"));
    textEdit->setMarginLineNumbers(1, true);
    textEdit->setMarginWidth(1, 50);

    //! Авто-дополнение кода в зависимости от источника
    textEdit->setAutoCompletionSource(QsciScintilla::AcsAll);
    textEdit->setAutoCompletionCaseSensitivity(true);
    textEdit->setAutoCompletionReplaceWord(true);
    textEdit->setAutoCompletionUseSingle(QsciScintilla::AcusAlways);
    textEdit->setAutoCompletionThreshold(0);

    //! Подсветка соответствий скобок
    textEdit->setBraceMatching(QsciScintilla::SloppyBraceMatch);
    textEdit->setMatchedBraceBackgroundColor(Qt::yellow);
    textEdit->setUnmatchedBraceForegroundColor(Qt::blue);

Теперь получаем относительно рабочий редактор, который даже что-то умеет. Конечно у него есть много недостатков, но все они тоже исправимы.

QScintilla: подсвечиваем синтаксис в приложении

На этом пожалуй, все. Я хотел бы еще рассказать про написание своего лексера, управление поиском и контроль строк, но это слишком много для одной статьи. Но если вы не хотите ждать следущей статьи, читайте документацию и самое главное — эксперементируйте!

Материалы

  • Исходники приложения которого мы с вами написали: qscintilla-demo
  • Оффициальная документация qscintilla

Спасибо за внимание, и удачного вам кодинга!

Автор: namespace


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js