Хорошее форматирование текста в QTextEdit, как и Qt Creator

Qt Creator замечает хорошую операцию форматирования, рисуя тонкую рамку вокруг некоторого текста (здесь пример, я ссылаюсь на рамки вокруг addRow, желтые области были результатом операции поиска текста, которая также обрамляла найденные местоположения, прежде чем я переместил курсор..)

Enter image description here

Я не смог найти, как получить этот эффект в QTextEdit. Я пытался читать из источников Qt Creator, но они слишком велики для неинформированных поиск...

редактировать

Я только что начал изучать пользовательский QTextCharAttribute, через

class framedTextAttr : public QTextObjectInterface {...}

редактировать

он работает: согласно мой ответ: ниже.

5 ответов


использовать QTextEdit::setExtraSelections() для выделения любых произвольных разделов документа. QTextEdit:: ExtraSelection класс - простой класс с открытыми переменными-членами, используемый для определения каждой подсветки. Чтобы создать подсветку,

  1. get QTextCursor С QTextEdit
  2. манипулируйте курсором так, чтобы он содержал правильный текст как выделение
  3. хранить курсор и желаемый 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);
}

и результат (здесь рисунок):

Enter image description here

Кажется, это трудно обобщить. Я не удовлетворен...

редактировать

на самом деле, это возможно. Я разработал некоторые проблемы с иллюстрированным подходом, и он кажется жизнеспособным также для складывании/раскладывании текст в многоразовом режиме.

Enter image description here

Я поставил мой тестовый проект на GitHub.


С помощью QTextEdit требование? Если нет, вы можете использовать Искра как компонент редактирования текста, который имеет привязку Qt. Искра есть индикатор функция, которая делает именно то, что вы хотите.


вы можете проверить пример syntaxhighlighter для кода Qt.Думаю, это будет полезно.


ну, использование части кода больших проектов, таких как Qt Creator, совсем не просто, и это может занять больше времени и усилий, чем создание собственного кода с нуля.

для вашей проблемы Qt имеет классный класс QSyntaxHighlighter что вы можете наследовать и устанавливать синтаксические шаблоны как регулярные выражения и правила (цвет, вес шрифта,...)

поэтому для вашего случая вам нужно установить синтаксические шаблоны динамически, когда пользователь вводит в поле Найти или при выборе word, а для правила синтаксиса это будет цвет фона.