четверг, 7 октября 2010 г.

QScintilla: создание редактора

Сейчас мы создадим экземпляр QScintilla и зададим ему некоторые свойства.
В качестве языка для подсветки будем использовать C++.

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

//Создаем редактор
QsciScintilla * textEdit = new QsciScintilla(this);

//Создаем и устанавливаем лексер для C++
QsciLexerCPP * lexCpp = new QsciLexerCPP(this);
textEdit->setLexer(lexCpp);

//Задаем формат ввода - без этого не будут вводиться русские буквы
textEdit->setUtf8(true);

//Текущая строка подсвечивается горизонтальной линией
textEdit->setCaretLineVisible(true);
//Цвет линии
textEdit->setCaretLineBackgroundColor(QColor("gainsboro"));

//Автоматический отступ
textEdit->setAutoIndent(true);
textEdit->setIndentationGuides(true);
//Заменять Tab на пробелы
textEdit->setIndentationsUseTabs(false);
//Ширина отступа - 4 пробела
textEdit->setIndentationWidth(4);

//Задаем символ конца строки
#if defined Q_WS_X11
textEdit->setEolMode(QsciScintilla::EolUnix);
#elif defined Q_WS_WIN
textEdit->setEolMode(QsciScintilla::EolWindows);
#elif defined Q_WS_MAC
textEdit->setEolMode(QsciScintilla::EolMac);
#endif

//Задаем цвет вертикальной полосы слева - там где ставятся breakpoints, закладки, номера строк
textEdit->setMarginsBackgroundColor(QColor("gainsboro"));
//Отображать номера строк
textEdit->setMarginLineNumbers(1, true);
//Ширина полосы - такая чтобы влезли символы до 1000
textEdit->setMarginWidth(1, QString("1000"));

//Автозавершение лексем
textEdit->setAutoCompletionSource(QsciScintilla::AcsAll);
textEdit->setAutoCompletionCaseSensitivity(true);
textEdit->setAutoCompletionReplaceWord(true);
textEdit->setAutoCompletionShowSingle(true);
textEdit->setAutoCompletionThreshold(2);

//Автоподсветка скобок
textEdit->setBraceMatching(QsciScintilla::SloppyBraceMatch);
//Цвет подсветки - желный с синим
textEdit->setMatchedBraceBackgroundColor(Qt::yellow);
textEdit->setUnmatchedBraceForegroundColor(Qt::blue);

//Слот на сигнал - "документ изменился"
connect(textEdit, SIGNAL(textChanged()),
 this, SLOT(documentWasModified()));
//Слот на сигнал - "курсор сместился"
connect(textEdit, SIGNAL(cursorPositionChanged(int, int)),
 this, SLOT(cursorMoved(int, int)));

* This source code was highlighted with Source Code Highlighter.
За дополнительной информацией по редактору можно обращаться к документации:
http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/classQsciScintilla.html

среда, 6 октября 2010 г.

QScintilla: собираем проект

Напишем pro файл для включения QScintilla в свой проект. Я не буду приводить весь файл, а укажу на что нужно обратить внимание.
  1. Конечно подключить библиотеку:
    unix:LIBS += -lqscintilla2
    win32:LIBS += qscintilla2.lib
  2. Определить переменные
    DEFINES += QSCINTILLA_DLL SCI_LEXER
    Здесь определены 2 переменные. Первая говорит, что мы используем экспорт из библиотеки qscintilla2. Вторая, что мы определяем свой лексер. Лексер - это объект, который отвечает за отрисовку текста. Соответственно, если в планах нет желания писать свой лексер (например, для какого-нибудь особо экзотического языка), то переменную SCI_LEXER определять не нужно.
Вот и все изменения в файле проекта.
В пределах видимости нужно расположить qscintilla2.dll и включить в INCLUDEPATH путь до заголовочных файлов QScintilla (например, QScintilla\Qt4\Qsci\).

После чего можно собирать проект.

QScintilla: установка

Живет QScintilla здесь:
http://www.riverbankcomputing.co.uk/software/qscintilla/intro
Периодически выходят обновления, на сегодняшний день последняя версия - 2.4.5.
QScintilla портирована как для Qt 3, так и для Qt 4. С третьей версией я не работаю и не знаю насколько там все хорошо, но для четверки все нормально, ничего допиливать не надо.

О лицензии.
RiverBank распространяет QScintilla под тремя лицензиями:
  • GNU General Public License v2
  • GNU General Public License v3
  • Riverbank Commercial License
К сожалению, GPL. GPL - несвободная лицензия с серьезным ограничением. Вы не сможете использовать QScintilla в коммерческих приложениях. Точнее вам придется тогда открыть весь исходный код вашего приложения. Вы также не сможете включать собранную библиотеку QScintilla в дистрибутив вашего приложения.
Но способ обойти ограничение есть.
Как обмануть GPL:
Например, можно на сайте сделать два линка: один на коммерческую программу , а второй — на GPL драйвер(библиотеку). Две независимые работы можно скачать по отдельности.
Вот такая неприятность.

Установка.
В сборке библиотеки нет ничего сложного - скачиваем, распаковываем, переходим в каталог QScintilla/Qt4 и запускаем qmake -tp vc. В итоге получаем проект qscintilla2.vcproj.
Собираем его.

Получаем в итоге qscintilla2.dll и qscintilla2.lib, которые будем использовать в программе.

В следующем выпуске начнем работу с Qscintilla.

QScintilla - продвинутый редактор для Qt

Открываю цикл статей о QScintilla. QScintilla это порт проекта Scintilla на Qt. Scintilla - это мощный кросплатформенный редактор текста.
В его возможности входит:
  • Подсветка исходного кода различных языков. Поддерживается 78 самых известных языков (Abaqus, Ada, APDL, Asm, Asn1, ASY, AU3, AVE, Baan, Bash, Basic, Bullant, Caml, CLW, Cmake, COBOL, Conf, CPP, Crontab, Csound, CSS, D, Eiffel, Erlang, EScript, Flagship, Forth, Fortran, GAP, Gen.py, Gui4Cli, Haskell, HTML, Inno, Kix, Lisp, Lout, Lua, Magik, Matlab, Metapost, MMIXAL, MPT, MSSQL, MySQL, Nimrod, Nsis, Opal, Others, Pascal, PB, Perl, PLM, POV, PowerPro, PowerShell, Progress, PS, Python, R, Rebol, Ruby, Scriptol, Smalltalk, SML, Sorcus, Specman, Spice, SQL, TACL, TADS3, TAL, TCL, TeX, VB, Verilog, VHDL, YAML)
  • Собственно редактирование кода и все, что с ним связано - отступы, cut/copy/paste, подсветка скобок и прочее. Возможностей - на полноценный текстовый редактор.
  • Есть возможность добавить собственный язык и задать для него собственную раскраску.
Среди русской части Интернета крайне мало информации о работе с QScintilla. В основном информацию приходилось собирать по форумам, вникать в документацию, которая, кстати без примеров.
В итоге я хочу в своем блоге выложить все, что мне известно о работе с QScintilla.

понедельник, 21 июня 2010 г.

вторник, 15 июня 2010 г.

Помещаем и извлекаем данные из PDF

Разобрался как работать с аттачами в PDF через PoDoFo (кстати он недавно обновился до 0.8.1).
Смысл в следующем - создается страница и к ней прикрепляется аннотация размером 0 на 0. Таких аннотаций на страницу может быть много. В качестве аннотации может быть текст, картинка или вложенный файл. Вот этим и воспользуемся.
Итак - сама страница будет отображать данные в красивом виде, таблички там и прочее. Это нам неинтересно на данном этапе. Сейчас важно научиться создавать вложенные файлы.

четверг, 3 июня 2010 г.

PDF в Qt

Столкнулся со следующей задачей.

Нужно хранить некие данные (текст + графика) достаточно большого объема (~50 Мб) в одном файле.
Желательно, чтобы это был общедоступный формат типа XML, но чтобы его мог просмотреть неискушенный юзер.
То есть, данные в документе еще должны быть и оформлены красивым образом.
На ум приходят:
1) XML + XSL. Данные храним в XML, для отображения используем файл стилей. Минус — нет сжатия данных, вместо одного файла получаем два.
2) OpenDocument. Не работал с ним.
3) XPS файл.
4) PDF.

четверг, 25 марта 2010 г.

DirectMapTableModel

От DirectMap легко породить модель для представления данных.
DirectMapTableModel - представляет простую таблицу из 2-х колонок.
В первой колонке - ключи мапа, во второй - значения.
Это нечто вроде QStringListModel, только с двумя колонками вместо одной.

понедельник, 1 марта 2010 г.

Qt баг

Под виндой с любой Qt, вплоть до последней, есть такой косяк с тулбаром.
Нужно: QMainWindow с тулбаром. Кнопка на тулбаре должна что-нибудь делать, желательно показывать некий диалог. Диалог должен закрываться по Esc.
Делаем: Быстро быстро клацаем по кнопке тулбара и тут же жмем Esc, закрывая тем самым диалог. На определенной итерации мы увидем, что кнопку тулбара залипла. Так, как будто у нее стоит статус Checkable.
Это легко проверить с Assistant'ом. Вызываем печать через тулбар и отменяем ее по Esc.
Итог: Весьма неприятно. На Qt и так полно нападок от нативщиков, и тут этот очевидный баг.

Rotated Label

Компонента "Вращаемая надпись" - QLabel, который может быть повернут на любой угол. Стандартными Qt выми средствами этого не сделать, поэтому нужно изобретать велосипед.

Сначала мой велосипед. Здесь используется отрисовка текста QPainter'ом.
И другой велосипед. От shapoclak.
Здесь товарищ подошел с более интересной стороны
В качестве девайса отрисовки виджета используется QPixmap. А сам QPixmap после любых манипуляций уже отрисовывается в любом другом месте. Подход хорош тем, что весь функционал QLabel остается.