Подтвердить что ты не робот

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

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

Enter image description here

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

изменить

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

class framedTextAttr : public QTextObjectInterface {...}

изменить

Работает: согласно моему ответу ниже.

4b9b3361

Ответ 1

С 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

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

изменить

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

Введите описание изображения здесь

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

Ответ 2

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

  • получить QTextCursor из QTextEdit
  • манипулировать курсором, чтобы он содержал правильный текст в качестве выделения
  • сохранить курсор и желаемый QTextCharFormat в объекте ExtraSelections (просто назначьте значения, нет необходимости в указателях или new)
  • сохраните объект ExtraSelections (как значение) в QList
  • повторите выше для всех основных тем, которые вы хотите.
  • вызов метода setExtraSelections()

Пример кода:

#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // create QTextEdit, with lot of text in it
    QTextEdit w("Alice and Bob (and Eve). ");
    for(int i=0;i<10;++i) w.setText(w.toPlainText() + w.toPlainText());

    // prepare variables for highlights
    QTextCharFormat fmt;
    fmt.setUnderlineStyle(QTextCharFormat::SingleUnderline);
    fmt.setUnderlineColor(QColor(200,200,200));
    fmt.setBackground(QBrush(QColor(230,230,230)));

    // highlight all text in parenthesis
    QTextCursor cursor = w.textCursor();
    while( !(cursor = w.document()->find(QRegExp("\\([^)]*\\)"), cursor)).isNull()) {
        QTextEdit::ExtraSelection sel = { cursor, fmt };
        selections.append(sel);
    }

    // set, show, go!
    w.setExtraSelections(selections);
    w.show();
    return a.exec();
}

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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