Russian Qt Forum
Апрель 30, 2024, 07:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Корректировка отображения текста в QTextEdit. Как сделать правильно?  (Прочитано 4984 раз)
Dimka Novikov
Гость
« : Апрель 22, 2016, 10:14 »

Ребята, привет. Помогите разобраться.

Есть такая задача - текст в редакторе (QTextEdit) разделён на страницы. Текст имеет несколько фиксированных стилей оформления. Если абзац, аформленный определённым стилем попадает на разрыв страниц, как тут:



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



Тут есть такой нюанс, что обновлять внешний вид нужно в режиме реального времени - прямо во время набора текста, т.е. если пользователь удалил текст перед этим абзацем, или ввёл новый, нужно скорректировать разрыв, или вообще его убрать, если он сместился на следующую страницу.

Подскажите пожалуйста,  как лучше сделать, или как бы вы решали эту проблему?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 22, 2016, 12:11 »

Если ничего стандартного нет (не в курсе), то однозначно какие-то QLabel рисуемые поверх QTextEdit  (но ни в коем случае не лезть в его содержимое)
Записан
Dimka Novikov
Гость
« Ответ #2 : Апрель 22, 2016, 22:29 »

Igors, спасибо. Я не нашёл никаких стандартных подходов к решению такой задачи. Просто рисовать сверху не выйдет, т.к. весь оставшийся текст должен быть сдвинут вниз после переноса...

Сейчас я делаю через правку документа. Это работает приемлемо на небольших документах до 15 страниц, с 40 страниц уже начинаются заметные лаги, а 300-страничных текстах просто вообще Грустный Хотя конечно может быть нужно просто как следует оптимизировать его... Но что-то мне тоже подсказывает, что надо идти другим путём, да вот не пойму каким?!...
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Апрель 23, 2016, 00:35 »

А как разбиение на страницы устроено?
Каждая страница это отдельный QTextEdit?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 23, 2016, 08:30 »

Сейчас я делаю через правку документа. Это работает приемлемо на небольших документах до 15 страниц, с 40 страниц уже начинаются заметные лаги, а 300-страничных текстах просто вообще Грустный Хотя конечно может быть нужно просто как следует оптимизировать его...
Не, это точно трясина из которой не выбраться

Я не нашёл никаких стандартных подходов к решению такой задачи. Просто рисовать сверху не выйдет, т.к. весь оставшийся текст должен быть сдвинут вниз после переноса...
Ну не знаю, так ли уж необходим сдвиг... Тогда я бы сначала подзубрил все смежные классы (QTextBlock, QTextFormat, QTextLine и.т.п), а главное - нашел бы в исходниках место где он форматирует страницу. Необязательно, но очень возможно он использует QTextLayout (см напр QTextBlock::layout), вот попытаться его перехватить, чтобы выдать "виртуальную" строку. Ну это конечно пока фантазии, просто напр-е в котором я бы рыл.
Записан
Dimka Novikov
Гость
« Ответ #5 : Апрель 23, 2016, 14:43 »

Racheengel, устроено так, что объекту QTextDocument назначается свойство pageSize, дальше QTextEdit через QTextDocumentLayout рисует документ с отступами между страниц, а потом сверху я ручками рисую оформление.

Igors, вот копаю... По-видимому придётся наследоваться от QTextDocumentLayout и все такие ситуации самостоятельно обрабатывать прорисовывая нужные абзацы текста.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Апрель 23, 2016, 21:31 »

А номера страниц тоже поверху рисуются?
Как тогда печать реализована?

Возможен вариант редактирования без доп. разметки, а уже при просмотре и печати бить на страницы и добавлять нужные строки?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Dimka Novikov
Гость
« Ответ #7 : Апрель 25, 2016, 10:08 »

А номера страниц тоже поверху рисуются?
Как тогда печать реализована?

Да, номера самостоятельно рисуются. При печати они также дорисовываются в процессе формирования страниц.

Возможен вариант редактирования без доп. разметки, а уже при просмотре и печати бить на страницы и добавлять нужные строки?

Когда проект только начинался, я так и хотел сделать редактор по типу вижу - что имею в виду, но большая часть пользователей (да практически все) затребовали сделать WYSIWYG-режим, так что без вариантов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.