Russian Qt Forum

Qt => Общие вопросы => Тема начата: Exception13 от Октябрь 06, 2009, 10:32



Название: непонятки с QFontMetrics::size()
Отправлено: Exception13 от Октябрь 06, 2009, 10:32
Надо узнать длину строки в пикселях.
делаю следующее:

данный код работеат в рамках объекта унаследованного от QWidget:

Код
C++ (Qt)
  QSize sz = fontMetrics().size(  Qt::TextSingleLine | Qt::TextExpandTabs,
                                                tr("\t\t\t\t") ,
                                                8 );
 

В результате он мне выдает sz.width() = 320, что характерно, изменение величины tabStops не приводит к какому - либо изменению конечного результата.
Почему то функция полностью игнорирует значение tabStops и всегда использует значение по умолчанию = 80 пикселам ?

В документации сказано следующее:

Цитировать
If Qt::TextExpandTabs is set in flags, then: if tabArray is non-null, it specifies a 0-terminated sequence of pixel-positions for tabs; otherwise if tabStops is non-zero, it is used as the tab spacing (in pixels).

Т.е. как я понял: если установлен флаг Qt::TextExpandTabs и значение tabArray = 0, и если значение tabStops отлично от 0, то оно используется в качестве размера для символа табуляции.
И пАчиму же оно не используется тогда ? это баг или фича такая ?


Название: Re: непонятки с QFontMetrics::size()
Отправлено: Makss от Октябрь 06, 2009, 11:36
баг ето или фича - я незнаю, но длину текста узнаю так
QFontMetrics fm(font());
int len_px = fm.width("qwerty");


Название: Re: непонятки с QFontMetrics::size()
Отправлено: Exception13 от Октябрь 06, 2009, 11:53
а как тому же самому QFontMetrics::width дать понять что ширина символа '\t' составляет n пикселов ?

Посмотрел по исходам - все вызовы boundingRect, size, ведут к qt_format_text, в котором некоторые строчки кода, как мне показались - вообще ни о чем. Так, напрмер, при расчете длины с ранее указанными флагами, параметр tabStops - вообще не используется.


Название: Re: непонятки с QFontMetrics::size()
Отправлено: Makss от Октябрь 06, 2009, 12:41
ну если я не ошибаюсь то \t или по другому просто табуляция зависит от настроек того же самого редактора в котором текст редактируется, ну и возможно от системы...
Все ведь видели и знают что если редактировать сначала в одном редакторе а потом тот же самый файл открыть в другом - получим разные по размерам табуляции или отступы от начала...


Название: Re: непонятки с QFontMetrics::size()
Отправлено: Exception13 от Октябрь 07, 2009, 09:01
Все ведь видели и знают что если редактировать сначала в одном редакторе а потом тот же самый файл открыть в другом - получим разные по размерам табуляции или отступы от начала...

ииии ??? :)

Что то мне другого способа пока не видится кроме как тупо глупо:
Код
C++ (Qt)
QString str = tr("\t\t\t\t");            // исходная строка
int tabCount = str_.count( QLatin1Char('\t') ); // узнаем количество табов в строчке
int myTabWidth = 8;                     // ширина моего таба в пикселях
int strWidth = fontMetrics().width( str ) -
  tabCount * ( fontMetrics().width(QString(QLatin1Char('\t'))) - myTabWidth );
 
Самое забавное:
fontMetrics().width(QLatin1Char('\t')) = 13, а
fontMetrics().width(QString(QLatin1Char('\t'))) = 80
??? вообще бредняк какой то ???