Russian Qt Forum

Qt => Общие вопросы => Тема начата: Dp0H от Март 01, 2012, 10:24



Название: 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";

 QStringList list = str.split("\n");
 // list1: [ "\ttext line 1" , "\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");
line = textLayout.createLine();
line.setNumColumns(13);
line = textLayout.createLine();
>  line.textStart() = 11 !
>  первая строка: "\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");
line = textLayout.createLine();
line.setNumColumns(13);
line = textLayout.createLine();
>  line.textStart() = 11 !
>  первая строка: "\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;
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,
а не пытаться разбивать текст на строки самостоятельно.


Название: 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 в контексте шрифта такого размера?