Хорошее форматирование текста в QTextEdit, как и Qt Creator
Qt Creator замечает хорошую операцию форматирования, рисуя тонкую рамку вокруг некоторого текста (здесь пример, я ссылаюсь на рамки вокруг addRow, желтые области были результатом операции поиска текста, которая также обрамляла найденные местоположения, прежде чем я переместил курсор..)
Я не смог найти, как получить этот эффект в QTextEdit. Я пытался читать из источников Qt Creator, но они слишком велики для неинформированных поиск...
редактировать
Я только что начал изучать пользовательский QTextCharAttribute, через
class framedTextAttr : public QTextObjectInterface {...}
редактировать
он работает: согласно мой ответ: ниже.
5 ответов
использовать QTextEdit::setExtraSelections()
для выделения любых произвольных разделов документа. QTextEdit:: ExtraSelection класс - простой класс с открытыми переменными-членами, используемый для определения каждой подсветки. Чтобы создать подсветку,
- get
QTextCursor
СQTextEdit
- манипулируйте курсором так, чтобы он содержал правильный текст как выделение
- хранить курсор и желаемый
QTextCharFormat
на
С помощью QTextObjectInterface я получаю кадр вокруг текстового объекта:
QSizeF framedTextAttr::intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format)
{
Q_ASSERT(format.type() == format.CharFormat);
const QTextCharFormat &tf = *(const QTextCharFormat*)(&format);
QString s = format.property(prop()).toString();
QFont fn = tf.font();
QFontMetrics fm(fn);
return fm.boundingRect(s).size();
}
void framedTextAttr::drawObject(QPainter *painter, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format)
{
Q_ASSERT(format.type() == format.CharFormat);
QString s = format.property(prop()).toString();
painter->drawText(rect, s);
painter->drawRoundedRect(rect, 2, 2);
}
но текст становится одним объектом, не более редактируемым
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setCentralWidget(new QTextEdit);
framedTextAttr *fa = new framedTextAttr;
editor()->document()->documentLayout()->registerHandler(framedTextAttr::type(), fa);
editor()->setPlainText("hic sunt\n leones !");
QTextCharFormat f;
f.setObjectType(fa->type());
QTextCursor c = editor()->document()->find("leones");
f.setProperty(fa->prop(), c.selectedText());
c.insertText(QString(QChar::ObjectReplacementCharacter), f);
}
и результат (здесь рисунок):
Кажется, это трудно обобщить. Я не удовлетворен...
редактировать
на самом деле, это возможно. Я разработал некоторые проблемы с иллюстрированным подходом, и он кажется жизнеспособным также для складывании/раскладывании текст в многоразовом режиме.
Я поставил мой тестовый проект на GitHub.
ну, использование части кода больших проектов, таких как Qt Creator, совсем не просто, и это может занять больше времени и усилий, чем создание собственного кода с нуля.
для вашей проблемы Qt имеет классный класс QSyntaxHighlighter
что вы можете наследовать и устанавливать синтаксические шаблоны как регулярные выражения и правила (цвет, вес шрифта,...)
поэтому для вашего случая вам нужно установить синтаксические шаблоны динамически, когда пользователь вводит в поле Найти или при выборе word, а для правила синтаксиса это будет цвет фона.