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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QHeaderView, sortindicator  (Прочитано 5863 раз)
leonike
Гость
« : Май 18, 2011, 10:09 »

Привет всем. Столкнулся со следующей проблемой.

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

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 18, 2011, 11:57 »

Через css скорее всего не получится.
Нужно перегрузить
Код
C++ (Qt)
QStyle::subElementRect(SE_HeaderLabel)
QStyle::subElementRect(SE_HeaderArrow)
Записан

Qt 5.11/4.8.7 (X11/Win)
leonike
Гость
« Ответ #2 : Май 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
« Последнее редактирование: Май 18, 2011, 12:52 от leonike » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 18, 2011, 12:53 »

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

И лучше наследоваться от QProxyStyle.
« Последнее редактирование: Май 18, 2011, 12:57 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
leonike
Гость
« Ответ #4 : Май 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 пикселей от левого края в секции. вот только теперь нужно сделать еще отступ для текста, чтобы на него не накладывался индикатор
« Последнее редактирование: Май 18, 2011, 13:10 от leonike » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 18, 2011, 13:18 »

Цитировать
вот только теперь нужно сделать еще отступ для текста, чтобы на него не накладывался индикатор
Тебе же несколько раз сказали
Цитировать
А где перегрузка SE_HeaderLabel?
Записан

Qt 5.11/4.8.7 (X11/Win)
leonike
Гость
« Ответ #6 : Май 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
но не выводится
и насколько я понял, то к отступу текста это ни имеет никакого значения

если я что-то не так делаю, то поясните
« Последнее редактирование: Май 18, 2011, 13:35 от leonike » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Май 18, 2011, 13:36 »

Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...

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

Qt 5.11/4.8.7 (X11/Win)
zenden
Гость
« Ответ #8 : Май 18, 2011, 13:38 »

Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...


Если наследоваться от стиля, то передается, а если наследоваться от QProxyStyle, то не передается. В коде стандартных стилей почти нигде не используется proxy()->subElementRect(), везде используется просто subElementRect.
Только я вот не знаю это баг или так задумано.
« Последнее редактирование: Май 18, 2011, 14:04 от zenden » Записан
leonike
Гость
« Ответ #9 : Май 18, 2011, 19:43 »

Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...
голословное, ничем не подкрепленное утверждение

Цитировать
SE_HeaderLabel не передается в метод subElementRect
У всех передаётся, а у тебя нет. Копай...
Если наследоваться от стиля, то передается, а если наследоваться от QProxyStyle, то не передается. В коде стандартных стилей почти нигде не используется proxy()->subElementRect(), везде используется просто subElementRect.
Только я вот не знаю это баг или так задумано.
буду копать, спасибо за информацию
« Последнее редактирование: Май 18, 2011, 19:50 от leonike » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Май 18, 2011, 20:02 »

Цитировать
голословное, ничем не подкрепленное утверждение
Подтверждённое исследованием исходников Qt.
zenden прав, почему то при использовании QProxyStyle происходит такое. Имхо, чистой воды баг. Надо будет ещё поисследовать это и отписать троллям, если подтвердится.
В общем получается, что зря я тебе посоветовал наследоваться от QProxyStyle.
Наследуйся от QCommonStyle, хотя без использования QProxyStyle может не отрабатывать qcc.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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