Хорошее форматирование текста в QTextEdit, например, Qt Creator
Qt Creator видит приятную операцию форматирования, рисуя тонкий кадр вокруг некоторого текста (вот пример, я ссылаюсь на рамки вокруг addRow, желтые области были результатом операции поиска текста, которая также создала найденные местоположения, прежде чем я переместил курсор.)
![Enter image description here]()
Мне не удалось найти, как получить этот эффект в QTextEdit. Я пытался читать источники Qt Creator, но они слишком велики для неинформированного поиска...
изменить
Я только начал изучать пользовательский QTextCharAttribute через
class framedTextAttr : public QTextObjectInterface {...}
изменить
Работает: согласно моему ответу ниже.
Ответы
Ответ 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. Думаю, это будет полезно.