Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QTextEdit и несколько выделений фона


Автор: becks 13.2.2013, 11:50
Добрый день, коллеги! Нужно выделить несколько участков в тексте разными цветами, делаю так (хочу выделить участок с 5 по 12 символ и с 15 по 19):

Код

QTextEdit *te_context = new QTextEdit(text);

QTextCursor cursor1 = te_context->textCursor();

cursor1.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 5);
cursor1.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 12);

QTextCharFormat charFormat1; charFormat1.setBackground(Qt::green);
cursor1.setCharFormat(charFormat1);

te_context->setTextCursor(cursor1);

QTextCursor cursor2 = te_context->textCursor();

cursor1.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 15);
cursor1.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 19);

QTextCharFormat charFormat2; charFormat2.setBackground(Qt::blue);
cursor1.setCharFormat(charFormat2);

te_context->setTextCursor(cursor2);

te_context->moveCursor(QTextCursor::End);


В итоге получается, что куски сливаются, т.е. закрашивается синим и пространство между 12 и 15 символами. Не могу понять почему? И правильно ли я делаю, что использую 2 курсора или можно проще? А вдруг нужно было бы выделить различными цветами 1000 кусков в тексте?
Спасибо.

Автор: math64 13.2.2013, 14:08
Следи за тем как движется курсор:
Код

int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QTextEdit edit;
  edit.show();
  QTextDocument* doc = edit.document();
  // Вставим текст
  QTextCursor cursor = edit.textCursor();
  cursor.insertText("Hello World!");
  // Вернём курсор в начало документа
  cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 0);
  edit.setTextCursor(cursor);

  // Выделим Hello и покрасим в зелёный цвет
  QTextCursor cursor = edit.textCursor();
  cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 5);
  QTextCharFormat charFormat;
  charFormat.setBackground(Qt::green);
  cursor.setCharFormat(charFormat);
  //edit.setTextCursor(cursor); не нужен, курсор редактора остаётся в начале

  // Выделим World и покрасим в синий цвет
  cursor = edit.textCursor();
  cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 6);
  cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 5);
  charFormat.setBackground(Qt::blue);
  cursor.setCharFormat(charFormat);
  app.exec();
}



Добавлено через 6 минут и 51 секунду
PS: 1000 кусков текста лучше красить у документа, который ещё не присоединён к редактору - чтобы не было лишних перерисовок.

Автор: becks 13.2.2013, 15:14
math64, получилось, большое спасибо. Один вопрос, в этом примере:

Код

QTextDocument* doc = edit.document();


Я правильно понимаю, что изначально вы хотели показать тоже самое, но через документ, и видимо забыли убрать эту строчку?

Автор: math64 14.2.2013, 11:47
Переделывал из другого примера. От него осталось. А при большой работе по раскраске лучше работать с документом, а не с виджетом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)