subElementRect
не вызывается для получения области заголовка для всех стилей.По крайней мере, стили XP, Vista и MacOSX напрямую используют QStyleOption::rect
, который передается в качестве параметра функции drawControl
для CE_DockWidgetTitle
.
Для обработки обоих случаев вам также следует переопределить drawControl
:
void drawControl(ControlElement element, const QStyleOption *option,
QPainter *painter, const QWidget *widget) const
{
const QStyleOptionDockWidget *dockWidget;
if(element == CE_DockWidgetTitle &&
(dockWidget = qstyleoption_cast<const QStyleOptionDockWidget *>(option)))
{
QStyleOptionDockWidget copy = *dockWidget;
copy.rect.adjust(50,0,0,0);
// or you can add spaces in the title to avoid the border moving left too
// copy.title = QString(50 / copy.fontMetrics.width(" "), QChar(' ')) + copy.title;
QProxyStyle::drawControl(element, ©, painter, widget);
return;
}
QProxyStyle::drawControl(element, option, painter, widget);
}
В качестве альтернативы вы можете использовать таблицу стилей с отступом или полем:
dockWidget->setStyleSheet("::title { position: relative; padding-left: 50px;"
" text-align: left center }");
Правило «позиция» ничего не делает, но необходимо, потому что странностиль применяется только в том случае, если присутствуют некоторые другие категории правил.
Текст также должен быть выровнен по вертикали, потому что выравнивание кажется потерянным при использовании таблицы стилей.