Название: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 01, 2012, 10:24 Хочу "разложить" строку:
"\ttext line 1\n\ttext line 2" В процессе меняю '\n' на пробелы и руками создаю новую строку в этом месте. В первом проходе делаю setNumColumns(13). Первая строка должна быть "\ttext line 1 ". Но после вызова createLine() обнаруживаю, что textStart() = 11(!), а '1' переносится на следующую строку. Если убрать табуляцию в начале первой строки: "text line 1\n\ttext line 2" то первоначальный вызов setNumColumns(12) приводит к textStart() = 13, и табуляция перед второй строкой, естественно, пропадает. Ну как так? Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: V1KT0P от Март 01, 2012, 15:05 Хочу "разложить" строку: Под "разложить" ты имеешь ввиду разбить строку на две? Тогда сплит тебе в помощь:"\ttext line 1\n\ttext line 2" В процессе меняю '\n' на пробелы и руками создаю новую строку в этом месте. В первом проходе делаю setNumColumns(13). Первая строка должна быть "\ttext line 1 ". Но после вызова createLine() обнаруживаю, что textStart() = 11(!), а '1' переносится на следующую строку. Если убрать табуляцию в начале первой строки: "text line 1\n\ttext line 2" то первоначальный вызов setNumColumns(12) приводит к textStart() = 13, и табуляция перед второй строкой, естественно, пропадает. Ну как так? Код: QString str = "\ttext line 1\n\ttext line 2"; Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 02, 2012, 08:32 Цитировать Под "разложить" ты имеешь ввиду разбить строку на две? См. сабж. Это из другой оперы.Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Bepec от Март 02, 2012, 13:08 Дрон ты бы сабж переписал. А то у тебя написано - "Туда сюда Дрынь брысь как?"
И вообще выложи лучше код. Так будет проще тебя понять, а то ты явно не писатель :) Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 02, 2012, 16:00 Bepec, ты наверняка очень опытный программист и разумный человек, но если сам сабж говорит тебе не больше, чем фраза "Туда сюда Дрынь брысь как?", то ты вряд ли сможешь мне помочь.
Итоги изучения bugreports.qt-project.org и затруднения на www.qtcentre.org приводят к мысли об ошибках в реализации QTextLine::setNumColumns(), о чем и был сделан багрепорт. Но таки хотелось бы, чтобы я ошибался.. На всякий - кратенько суть: http://wiki.linuxformat.ru/index.php/LXF104:Qt4#.D0.9F.D0.B8.D1.88.D0.B5.D0.BC_.D0.BA.D1.80.D0.B0.D1.81.D0.B8.D0.B2.D0.BE (http://wiki.linuxformat.ru/index.php/LXF104:Qt4#.D0.9F.D0.B8.D1.88.D0.B5.D0.BC_.D0.BA.D1.80.D0.B0.D1.81.D0.B8.D0.B2.D0.BE) Код: textLayout.setText("\ttext line 1 text line 2"); > первая строка: "\ttext line" > вторая: "1 text line 2" Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: V1KT0P от Март 02, 2012, 17:40 Bepec, ты наверняка очень опытный программист и разумный человек, но если сам сабж говорит тебе не больше, чем фраза "Туда сюда Дрынь брысь как?", то ты вряд ли сможешь мне помочь. Реально хрень какая-то. У меня почему-то табуляцию принимает не как один символ а как семь символов о_О.Итоги изучения bugreports.qt-project.org и затруднения на www.qtcentre.org приводят к мысли об ошибках в реализации QTextLine::setNumColumns(), о чем и был сделан багрепорт. Но таки хотелось бы, чтобы я ошибался.. На всякий - кратенько суть: http://wiki.linuxformat.ru/index.php/LXF104:Qt4#.D0.9F.D0.B8.D1.88.D0.B5.D0.BC_.D0.BA.D1.80.D0.B0.D1.81.D0.B8.D0.B2.D0.BE (http://wiki.linuxformat.ru/index.php/LXF104:Qt4#.D0.9F.D0.B8.D1.88.D0.B5.D0.BC_.D0.BA.D1.80.D0.B0.D1.81.D0.B8.D0.B2.D0.BE) Код: textLayout.setText("\ttext line 1 text line 2"); > первая строка: "\ttext line" > вторая: "1 text line 2" Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Bepec от Март 02, 2012, 19:11 Дрон - вплотную разбираться с каждым вопросом нет ни времени, ни желания (вплотную значит пытать тебя, чтобы пояснить, что ты хочешь сказать)
Навскидку могу сказать - \t заменяется 4 пробелами. Это стандарт. И если посчитать - то он вписывается 200% в твою теорию. (но это надо проверять. ) И да, на форумах желательно выкладывать МИНИМАЛЬНО компилируемый кусок кода. С объявлением переменных и места, где они должны быть объявлены(если есть такие условия). PS не будь свиньёй - накарябай что line - QTextLine, textLayot -//-, и всё пишется в -//-. Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Bepec от Март 02, 2012, 19:44 update:
Интересный класс, никогда раньше им не пользовался. Но сразу говорю - давай более полные куски кода, а то у меня он \t как 1 символ считает... Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 05, 2012, 09:01 Минимально компилируемый кусок указан в виде ссылки, просто текст makeLayout упрощается фактически до указанных ранее строк:
Код: QTextLine line; Код: QTextOption opt; И в свете всего этого символ '\t' действительно считается одним символом. И это одна из многих фич (расчет размеров с учетом расположения, размеров отступов и табуляций), вынуждающая пользоваться именно этим API, а не пытаться разбивать текст на строки самостоятельно. Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 05, 2012, 13:05 Эксперименты показали, что в зависимости от размера табуляции ( QTextOption::setTabStop() ) символ табуляции может занимать в функции QTextLine::setNumColumns() разное количество символов. Глубокая норвежская логика...
Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Bepec от Март 05, 2012, 13:12 Всё логично. Ты указываешь величину таба, и он рассчитывает площадь для отрисовки соответственно значениям ;)
В принципе моя догадка была верна, но чуть-чуть необоснована. Как и в любом редакторе - таб заменяется пробелами, согласно установленным настройкам. Просто по умолчанию(в большинстве своём) в редакторах он занимает 4 пробела. Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 05, 2012, 14:20 Вряд ли device units измеряются пробелами. И мое значение tabStop, при котором символ табуляции посчитался как один символ, пока никак ни с чем не вяжется.
И, собственно, первоначальная задача теперь усложнилась и получила неизвестные переменные.... Будем рыть дальше. ЗЫ И табы заменяются пробелами только в специализированных редакторах (обычно для программистов) по просьбе пользователя, выраженной соотв. настройкой. В остальных случаях позиции табуляции можно указать с точностью до 1... эээ.. похоже, device unit'а. Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Bepec от Март 05, 2012, 14:23 У меня прост ещё недоумение вызывает. Если с твоим куском кода компилировать код, то он в 1 строке (с num13 ) выдаёт просто пустоту(\t) величиной 1. Если ж без него, всё так как тебе надо.
Название: Re: QTextLayout, QTextLine::setNumColumns - ну как так?! Отправлено: Dp0H от Март 05, 2012, 14:58 Шрифт MS Shell Dlg 2, point size = 8.25 (дефолт).
Размер символа табуляции съедает 2 "колонки" (setNumColumns, не моноширинный шрифт.. (?)) вместо одной при смене значения аргумента setTabStop с 3.21 на 3.22 (надеюсь, что ничего не спутал - у меня везде масштаб "прыгает" с 1 на 100 и обратно из-за проблем точностью отрисовки текста). Есть какие-нибудь ассоциации с цифрой 3.21 в контексте шрифта такого размера? |