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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextLayout, QTextLine::setNumColumns - ну как так?!  (Прочитано 6725 раз)
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, и табуляция перед второй строкой, естественно, пропадает.
Ну как так?
Записан
V1KT0P
Гость
« Ответ #1 : Март 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";

 QStringList list = str.split("\n");
 // list1: [ "\ttext line 1" , "\ttext line 2" ]
Записан
Dp0H
Гость
« Ответ #2 : Март 02, 2012, 08:32 »

Цитировать
Под "разложить" ты имеешь ввиду разбить строку на две?
См. сабж. Это из другой оперы.
« Последнее редактирование: Март 02, 2012, 09:07 от Dp0H » Записан
Bepec
Гость
« Ответ #3 : Март 02, 2012, 13:08 »

Дрон ты бы сабж переписал. А то у тебя написано - "Туда сюда Дрынь брысь как?"

И вообще выложи лучше код. Так будет проще тебя понять, а то ты явно не писатель Улыбающийся
Записан
Dp0H
Гость
« Ответ #4 : Март 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

Код:
textLayout.setText("\ttext line 1 text line 2");
line = textLayout.createLine();
line.setNumColumns(13);
line = textLayout.createLine();
>  line.textStart() = 11 !
>  первая строка: "\ttext line"
>  вторая: "1 text line 2"
Записан
V1KT0P
Гость
« Ответ #5 : Март 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

Код:
textLayout.setText("\ttext line 1 text line 2");
line = textLayout.createLine();
line.setNumColumns(13);
line = textLayout.createLine();
>  line.textStart() = 11 !
>  первая строка: "\ttext line"
>  вторая: "1 text line 2"

Реально хрень какая-то. У меня почему-то табуляцию принимает не как один символ а как семь символов о_О.
Записан
Bepec
Гость
« Ответ #6 : Март 02, 2012, 19:11 »

Дрон - вплотную разбираться с каждым вопросом нет ни времени, ни желания (вплотную значит пытать тебя, чтобы пояснить, что ты хочешь сказать)

Навскидку могу сказать - \t заменяется 4 пробелами. Это стандарт. И если посчитать - то он вписывается 200% в твою теорию.
(но это надо проверять. )

И да, на форумах желательно выкладывать МИНИМАЛЬНО компилируемый кусок кода. С объявлением переменных и места, где они должны быть объявлены(если есть такие условия).

PS не будь свиньёй - накарябай что line - QTextLine, textLayot -//-, и всё пишется в -//-.
« Последнее редактирование: Март 02, 2012, 19:23 от Bepec » Записан
Bepec
Гость
« Ответ #7 : Март 02, 2012, 19:44 »

update:

Интересный класс, никогда раньше им не пользовался. Но сразу говорю - давай более полные куски кода, а то у меня он \t как 1 символ считает...

« Последнее редактирование: Март 02, 2012, 19:47 от Bepec » Записан
Dp0H
Гость
« Ответ #8 : Март 05, 2012, 09:01 »

Минимально компилируемый кусок указан в виде ссылки, просто текст makeLayout упрощается фактически до указанных ранее строк:
Код:
QTextLine line;
textLayout->beginLayout();
line = textLayout->createLine();
line.setNumColumns(13);
line = textLayout.createLine();
textLayout->endLayout();
Символ табуляции не заменяется пробелами и не имеет стандарта. Работа с этим символом определяется настройками примерно так:
Код:
QTextOption opt;
opt.setTabStop(5);  //Sets the default distance in device units between tab stops
opt.setAlignment(Qt::AlignLeft | Qt::AlignTop);
opt.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
textLayout.setTextOption(opt);
Позицию каждой табуляции можно указать явно (как в популярных текстовых процессорах) функцией QTextOption::setTabs().
И в свете всего этого символ '\t' действительно считается одним символом. И это одна из многих фич
(расчет размеров с учетом расположения, размеров отступов и табуляций), вынуждающая пользоваться именно этим API,
а не пытаться разбивать текст на строки самостоятельно.
Записан
Dp0H
Гость
« Ответ #9 : Март 05, 2012, 13:05 »

Эксперименты показали, что в зависимости от размера табуляции ( QTextOption::setTabStop() ) символ табуляции может занимать в функции QTextLine::setNumColumns() разное количество символов. Глубокая норвежская логика...
Записан
Bepec
Гость
« Ответ #10 : Март 05, 2012, 13:12 »

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

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

Как и в любом редакторе - таб заменяется пробелами, согласно установленным настройкам. Просто по умолчанию(в большинстве своём) в редакторах он занимает 4 пробела.
Записан
Dp0H
Гость
« Ответ #11 : Март 05, 2012, 14:20 »

Вряд ли device units измеряются пробелами. И мое значение tabStop, при котором символ табуляции посчитался как один символ, пока никак ни с чем не вяжется.
И, собственно, первоначальная задача теперь усложнилась и получила неизвестные переменные.... Будем рыть дальше.

ЗЫ
И табы заменяются пробелами только в специализированных редакторах (обычно для программистов) по просьбе пользователя, выраженной соотв. настройкой.
В остальных случаях позиции табуляции можно указать с точностью до 1... эээ.. похоже, device unit'а.
« Последнее редактирование: Март 05, 2012, 14:23 от Dp0H » Записан
Bepec
Гость
« Ответ #12 : Март 05, 2012, 14:23 »

У меня прост ещё недоумение вызывает. Если с твоим куском кода компилировать код, то он в 1 строке (с num13 ) выдаёт просто пустоту(\t) величиной 1. Если ж без него, всё так как тебе надо.
Записан
Dp0H
Гость
« Ответ #13 : Март 05, 2012, 14:58 »

Шрифт MS Shell Dlg 2, point size = 8.25 (дефолт).
Размер символа табуляции съедает 2 "колонки" (setNumColumns, не моноширинный шрифт.. (?)) вместо одной при смене значения аргумента setTabStop с 3.21 на 3.22
(надеюсь, что ничего не спутал - у меня везде масштаб "прыгает" с 1 на 100 и обратно из-за проблем точностью отрисовки текста).
Есть какие-нибудь ассоциации с цифрой 3.21 в контексте шрифта такого размера?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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