Название: QTextEdit и блоки текста Отправлено: Rosster от Мая 24, 2012, 15:44 Всем привет, подскажите как можно реализовать следующую задачу:
Есть строка и нужно ее включить в QTextEdit: this is text right, but this is text not right Во-первых, если делать с помощью QTextBlock, то никак не могу достичь, чтобы они были в одной строке, а не каждый блок с новой строки. Во-вторых, если пользователь вводит данные сразу после слова right, то текст печатается синим, а мне бы хотелось чтобы right был отдельным блоком и сразу после него печаталось обычным текстом,т.е. печатал уже в блоке ", but this is text " Кто сможет помочь - ответьте. Спасибо. Название: Re: QTextEdit и блоки текста Отправлено: Bepec от Мая 24, 2012, 15:50 Эм. По порядку.
1) каждый блок с новой строки - вы что-то делаете неправильно, вот оно и получается(% на 80 уверен). Код в студию, ваши попытки и способы обхода в студию. 2) Вот тут уже нужно изменять механизм блоков. Ибо вы сейчас хотите сделать выход из блока. Сами подумайте - по каким критериям вы сможете понять, что пользователь хочет напечатать синим, а по каким - не хочет. :D Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 24, 2012, 16:20 Код: QTextCursor cursor(textEdit->textCursor()); Получается все с новой строки. Про второй вариант: у меня задача такая: блоки right и not right пользователь не должен редактировать. Это я думаю смогу сделать с помощью восстановления текста через сигнал textChanged(). Но при этом пользователь должен спокойно писать до и после этих блоков. Вот в этом проблема. Название: Re: QTextEdit и блоки текста Отправлено: Bepec от Мая 24, 2012, 16:49 Если у тебя пользователь выделение текста не может(не имеет возможности), тогда тупо перекрашивай всё при любом изменении допустим.
Или же у тебя right /??? не статические, а изменяющиеся? Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 24, 2012, 21:57 Да да, именно так, я эти данные беру из БД и мне еще нужно в этих блоках как-то хранить их id (ищу ответа пока в инете).
Мне вот главное узнать как писать блоки слитно, а не с каждой строки. Название: Re: QTextEdit и блоки текста Отправлено: vregess от Мая 25, 2012, 09:13 Я думаю ты подошел не стой стороны.
Во-первых QTextBlock по определению это параграф. Так что каждый QTextBlock будет с новой строки. Во-вторых, имхо, подсветку лучше сделать через QSyntaxHighlighter - в нем подсвечивать нужные элементы. Как предлагаю сделать. Для QTextBlock есть возможность устанавливать пользовательские данные: QTextBlock::setUserData(), QSyntaxHighlighter ::setCurrentBlockUserData(). Тебе нужно при каждом изменении блока парсить его содержание и сохранять результат в качестве user data для блока (тут же и твой id можно хранить). Этот user data ты потом будешь использовать в QTextEdit, чтобы запретить редактирование. Highlighter парсит текущий блок, создает нужные данные и заодно подсвечивает что надо. Псевдокод: Код
А QTextEdit использует BlockData допустим в QTextEdit::keyPressEvent() Псевдокод: Код
[1] - сверяешь позицию курсора с границами right и not right и делаешь e->ignore(), если надо запретить. И, наверное, если ты работаешь просто с текстом, лучше использовать QPlainTextEdit вместо QTextEdit. Как-то так. Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 25, 2012, 11:27 Спасибо, очень познавательно. Только, если считать, что я буду все писать в одном блоке (так как не могу использовать разные параграфы, текст и переменные со своим id должны быть на одной строке), то это будет гемор, я, например, не смогу хранить в setCurrentBlockUserData() id одной переменной, в этом блоке будет куча простого текста и переменных.
Может есть кроме QTextEdit еще какой-нить класс, чтобы блоки не разбивались на параграфы и разделялись между собой ем-то иным? Название: Re: QTextEdit и блоки текста Отправлено: Bepec от Мая 25, 2012, 12:00 хм. Может я неверно понимаю задачу, но почему бы вам не попробовать написать свой виджет с необходимыми вам функциями?
Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 25, 2012, 12:17 Потому что мне нужны все функции и возможности присущие QTextEdit - копировать, вставка, возможность добавления QAction в меню и т.д.
Никак не могу понять, кому удобны будут блоки в виде параграфа, если это текстовый редактор. Кому надо писать так: this is text right , but this is text not right Если можно написать слитно. Даже word визуально работает с блоками :) В инете нашел инфу, где сказано: чтобы блоки не разделялись параграфами, нужно использовать QTextDocument с текстом в виде <p></p>. Но никаких примеров нету, и сам пробовал - не получилось. Название: Re: QTextEdit и блоки текста Отправлено: vregess от Мая 25, 2012, 12:56 Спасибо, очень познавательно. Только, если считать, что я буду все писать в одном блоке (так как не могу использовать разные параграфы, текст и переменные со своим id должны быть на одной строке), то это будет гемор, я, например, не смогу хранить в setCurrentBlockUserData() id одной переменной, в этом блоке будет куча простого текста и переменных. Может есть кроме QTextEdit еще какой-нить класс, чтобы блоки не разбивались на параграфы и разделялись между собой ем-то иным? Один блок или много блоков. Не вижу проблем. Тот же QSyntaxHighlighter используется и для QTextEdit (где много блоков) и для QLineEdit (где всего один блок). Почему "не смогу хранить в setCurrentBlockUserData() id одной переменной"? можно хранить хоть десять id. Почему бы во время парсинга не привязывать id к позиции в блоке? Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 25, 2012, 13:37 Цитировать Почему бы во время парсинга не привязывать id к позиции в блоке? Потому что пользователь может вводить текст куда хочет (кроме в переменную) и как хочет. Поэтому, естественно, позиция переменной, той же "right", уже изменится и неизвестно на какую величину. Если бы это все было статично, то проблем бы не было :)Название: Re: QTextEdit и блоки текста Отправлено: vregess от Мая 25, 2012, 15:16 Потому что пользователь может вводить текст куда хочет (кроме в переменную) и как хочет. Поэтому, естественно, позиция переменной, той же "right", уже изменится и неизвестно на какую величину. Если бы это все было статично, то проблем бы не было :) Так для этого и делается Код
При каждом изменении текста будет создаваться новый user data с актуальными данными. Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 25, 2012, 16:10 Код [1] - здесь я знаю, что это переменная [2] - откуда я узнаю rightStart и rightLen, если позиция все-время меняется а setCurrentBlockUserData присваивает текущему блоку, а блок то у нас один Дебаг мне выведет: this is text this is text right //откуда я узнаю, что right - это переменная?Тем более если юзер нажал на букву //сравнивать с предыдущим текстом?Тогда как? this is text right, but this is text Мне потом содержимое textEdit нужно взять обратно, чтобы занести это в БД, и естественно мне нужно знать где переменные, а где измененный текст, например перебором BlockData и если есть id, то это переменная. Или я что-то не догоняю ??? Пятница все-таки. Если можно поподробней :) Название: Re: QTextEdit и блоки текста Отправлено: vregess от Мая 26, 2012, 12:14 Откуда ты знаешь, что [1] - это переменная? По каким параметрам?
Название: Re: QTextEdit и блоки текста Отправлено: Rosster от Мая 26, 2012, 17:13 ck, Надо было конечно мне с самого начала рассказать. Думал и так будет понятно.
У меня с БД приходит текст в виде шаблона, например: this is text <v>1</v>, but this is text <v>2</v>. Я его без проблем разбираю на части и вместо id подставляю переменные. Так как это шаблон, то пользователь, после вставки шаблона в textedit, дополняет и пишет что угодно. При этом сами переменные редактировать не может, только удалить или вставить новые (как это сделать я думаю сам догадаюсь). Ну а далее нужно этот текст уже измененный снова занести в БД. Мне хотя бы реализовать вставку нормальную, раскраску переменных. Название: Re: QTextEdit и блоки текста Отправлено: vregess от Мая 29, 2012, 09:33 Возможно придется как-то установить начальные позиции этих переменных, а потом обновлять их при изменении текста
|