Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: leonike от Май 18, 2011, 10:09



Название: QHeaderView, sortindicator
Отправлено: leonike от Май 18, 2011, 10:09
Привет всем. Столкнулся со следующей проблемой.

Нужно, чтобы индикатор сортировки в QHeaderView отображался в секции не справа, а слева. Не могу понять, как сделать
Пробовал с помощью qss (margin, position), не работает.


Название: Re: QHeaderView, sortindicator
Отправлено: GreatSnake от Май 18, 2011, 11:57
Через css скорее всего не получится.
Нужно перегрузить
Код
C++ (Qt)
QStyle::subElementRect(SE_HeaderLabel)
QStyle::subElementRect(SE_HeaderArrow)


Название: Re: QHeaderView, sortindicator
Отправлено: leonike от Май 18, 2011, 12:44
наследую от QCommonStyle, переопределяю subElementRect:

Код
C++ (Qt)
QRect HeaderStyle::subElementRect(SubElement subElement, const QStyleOption *option, const QWidget *widget) const
{
   if (subElement == QStyle::SE_HeaderArrow) {
       QRect rect = QCommonStyle::subElementRect(subElement, option, widget);
       rect.setLeft(5);
       return rect;
   }
   return QCommonStyle::subElementRect(subElement, option, widget);
}

Ставлю стиль для хидера:
Код
C++ (Qt)
treeWidget->header()->setStyle(new HeaderStyle)

Однако, проблема следующая, индикатор отображается слева, но при увеличение ширины секции отступ слева увеличивается

Не могу понять, с каким параметрами нужно передавать QRect


Название: Re: QHeaderView, sortindicator
Отправлено: GreatSnake от Май 18, 2011, 12:53
Цитировать
Однако, проблема следующая, индикатор отображается слева, но при увеличение ширина секции отступ слева увеличивается
Недочитал описание QRect::setLeft(). Используй QRect::moveLeft().
А где перегрузка SE_HeaderLabel?

И лучше наследоваться от QProxyStyle.


Название: Re: QHeaderView, sortindicator
Отправлено: leonike от Май 18, 2011, 13:06
Цитировать
Однако, проблема следующая, индикатор отображается слева, но при увеличение ширина секции отступ слева увеличивается
Недочитал описание QRect::setLeft(). Используй QRect::moveLeft().
А где перегрузка SE_HeaderLabel?

И лучше наследоваться от QProxyStyle.

а для чего SE_HeaderLabel?

сделал так:
Код
C++ (Qt)
QRect HeaderStyle::subElementRect(SubElement subElement, const QStyleOption *option, const QWidget *widget) const
{
   if (subElement == QStyle::SE_HeaderArrow) {
       QRect headerLabelRect = QProxyStyle::subElementRect(QStyle::SE_HeaderLabel, option, widget);
       int left = headerLabelRect.left() + 5;
 
       QRect rect = QProxyStyle::subElementRect(subElement, option, widget);
       rect.moveLeft(left);
 
       return rect;
   }
   return QProxyStyle::subElementRect(subElement, option, widget);
}

все работает. отступ 5 пикселей от левого края в секции. вот только теперь нужно сделать еще отступ для текста, чтобы на него не накладывался индикатор


Название: Re: QHeaderView, sortindicator
Отправлено: GreatSnake от Май 18, 2011, 13:18
Цитировать
вот только теперь нужно сделать еще отступ для текста, чтобы на него не накладывался индикатор
Тебе же несколько раз сказали
Цитировать
А где перегрузка SE_HeaderLabel?


Название: Re: QHeaderView, sortindicator
Отправлено: leonike от Май 18, 2011, 13:29
Цитировать
вот только теперь нужно сделать еще отступ для текста, чтобы на него не накладывался индикатор
Тебе же несколько раз сказали
Цитировать
А где перегрузка SE_HeaderLabel?
SE_HeaderLabel не передается в метод subElementRect

если сделать так:
Код
C++ (Qt)
QRect HeaderStyle::subElementRect(SubElement subElement, const QStyleOption *option, const QWidget *widget) const
{
   if (subElement == QStyle::SE_HeaderArrow) {
       QRect headerLabelRect = QProxyStyle::subElementRect(QStyle::SE_HeaderLabel, option, widget);
       int left = headerLabelRect.left() + 5;
 
       QRect rect = QProxyStyle::subElementRect(subElement, option, widget);
       rect.moveLeft(left);
 
       return rect;
   } else if (subElement == QStyle::SE_HeaderLabel) {
       qDebug() << 123;
   }
   return QProxyStyle::subElementRect(subElement, option, widget);
}
то при каждом вызове subElementRect c передачей SE_HeaderLabel, в консоль должно выводиться 123
но не выводится
и насколько я понял, то к отступу текста это ни имеет никакого значения

если я что-то не так делаю, то поясните


Название: Re: QHeaderView, sortindicator
Отправлено: GreatSnake от Май 18, 2011, 13:36
Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...

Цитировать
и насколько я понял, то к отступу текста это ни имеет никакого значения
Для определения места отрисовки текста используется именно SE_HeaderLabel.


Название: Re: QHeaderView, sortindicator
Отправлено: zenden от Май 18, 2011, 13:38
Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...


Если наследоваться от стиля, то передается, а если наследоваться от QProxyStyle, то не передается. В коде стандартных стилей почти нигде не используется proxy()->subElementRect(), везде используется просто subElementRect.
Только я вот не знаю это баг или так задумано.


Название: Re: QHeaderView, sortindicator
Отправлено: leonike от Май 18, 2011, 19:43
Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...
голословное, ничем не подкрепленное утверждение

Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...
Если наследоваться от стиля, то передается, а если наследоваться от QProxyStyle, то не передается. В коде стандартных стилей почти нигде не используется proxy()->subElementRect(), везде используется просто subElementRect.
Только я вот не знаю это баг или так задумано.
буду копать, спасибо за информацию


Название: Re: QHeaderView, sortindicator
Отправлено: GreatSnake от Май 18, 2011, 20:02
Цитировать
голословное, ничем не подкрепленное утверждение
Подтверждённое исследованием исходников Qt.
zenden прав, почему то при использовании QProxyStyle происходит такое. Имхо, чистой воды баг. Надо будет ещё поисследовать это и отписать троллям, если подтвердится.
В общем получается, что зря я тебе посоветовал наследоваться от QProxyStyle.
Наследуйся от QCommonStyle, хотя без использования QProxyStyle может не отрабатывать qcc.