- PVSM.RU - https://www.pvsm.ru -
Привет, $username!
Сегодня я хочу рассказать вам про отличный проект — QScintilla, который подсвечивает синтаксис кода в Qt-приложениях. Нередко возникает необходимось что-то подсвечивать. Например: C++, Bash, PHP, Diff… Этот список можно продолжать и продолжать. Но вот решение: порт Scintilla на Qt: QScintilla.
В этом посте я расскажу как установить и пользоваться QScintilla в своих приложениях на примере Ubuntu Linux.
Начнем, пожалуй, с самого главного — с установки. Предлагаю собрать QScintilla и установить ее в систему. Для этого скачаем тарбол qscintilla [1]. Распаковываем его в нужную нам папку. Теперь консолька. Выполняем пару нехитрых комманд:
cd Qt4
qmake
make
sudo make install
Отличненько. Если вы все сделали правильно, у вас в системе появиться libqscintilla2.so
Ура! Можно начинать кодить. Открывааем криейтор — создаем проект. Теперь добавляем в профайл строчку:
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++ код на ура.
Пока это не выглядит очень круто, но это только пока. А теперь начинаеться самое интересное. Предлагаю расширить наш редактор и украсить его. Дописываем в конструктор:
//! Текущая строка кода и ее подсветка
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);
Теперь получаем относительно рабочий редактор, который даже что-то умеет. Конечно у него есть много недостатков, но все они тоже исправимы.
На этом пожалуй, все. Я хотел бы еще рассказать про написание своего лексера, управление поиском и контроль строк, но это слишком много для одной статьи. Но если вы не хотите ждать следущей статьи, читайте документацию и самое главное — эксперементируйте!
Спасибо за внимание, и удачного вам кодинга!
Автор: namespace
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/8359
Ссылки в тексте:
[1] qscintilla: http://www.riverbankcomputing.com/software/qscintilla/download
[2] Image: http://dl.dropbox.com/u/7131620/Habr/qsci/step-1.png
[3] Image: http://dl.dropbox.com/u/7131620/Habr/qsci/step-2.png
[4] qscintilla-demo: http://dl.dropbox.com/u/7131620/Habr/qsci/qscintilla-demo.tar.gz
[5] qscintilla: http://www.riverbankcomputing.com/static/Docs/QScintilla2/annotated.html
Нажмите здесь для печати.