最近做多国语言,将中英文翻译成法语,西班牙语。翻译之后的法语和西班牙语的字符数太多(英文只有6个字符,法语变成了20个!!)。以前的QToolbutton的text不换行就完全显示不全了。现在想自己写一个支持字符数太多就换行的style,主要从QPlastiqueStyle的风格继承。
ToolButton的绘制在PaintEvent里面,过程如下
QStylePainter p(this);
QStyleOptionToolButton opt;
initStyleOption(&opt);
p.drawComplexControl(QStyle::CC_ToolButton, opt);
QStylePainter是QT提供的便利类。其实
p.drawComplexControl(QStyle::CC_ToolButton, opt);调用的还是这个style的drawComplexControl();对于CC_ToolButton这个匹配项(QStyle的枚举CC对应ComplexControl),QPlastiqueStyle,QWindowsStyle的drawComplexControl中都没有。最后在QCommonStyle中找到。
if (const QStyleOptionToolButton *toolbutton
= qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
QRect button, menuarea;
//返回subControl SC_Toolbutton的RECT
button = proxy()->subControlRect(cc, toolbutton, SC_ToolButton, widget);
menuarea = proxy()->subControlRect(cc, toolbutton, SC_ToolButtonMenu, widget);
State bflags = toolbutton->state & ~State_Sunken;
if (bflags & State_AutoRaise) {
if (!(bflags & State_MouseOver) || !(bflags & State_Enabled)) {
bflags &= ~State_Raised;
}
}
State mflags = bflags;
if (toolbutton->state & State_Sunken) {
if (toolbutton->activeSubControls & SC_ToolButton)
bflags |= State_Sunken;
mflags |= State_Sunken;
}
QStyleOption tool(0);
tool.palette = toolbutton->palette;
if (toolbutton->subControls & SC_ToolButton) {
if (bflags & (State_Sunken | State_On | State_Raised)) {
tool.rect = button;
tool.state = bflags;
//按前面的状态判断绘制PE元素,Panel是面板的意思
proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
}
}
if (toolbutton->state & State_HasFocus) {
QStyleOptionFocusRect fr;
fr.QStyleOption::operator=(*toolbutton);
fr.rect.adjust(3, 3, -3, -3);
if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup)
fr.rect.adjust(0, 0, -proxy()->pixelMetric(QStyle::PM_MenuButtonIndicator,
toolbutton, widget), 0);
//获取焦点时focus区域的绘制
proxy()->drawPrimitive(PE_FrameFocusRect, &fr, p, widget);
}
//这一段应该就是字体大小和Label绘制的代码
QStyleOptionToolButton label = *toolbutton;
label.state = bflags;
int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt, widget);//这里使用的PM_DefaultFrameWidth,在这个枚举中没有找到特别为ToolButton定制的。
label.rect = button.adjusted(fw, fw, -fw, -fw);
proxy()->drawControl(CE_ToolButtonLabel, &label, p, widget);
if (toolbutton->subControls & SC_ToolButtonMenu) {
tool.rect = menuarea;
tool.state = mflags;
if (mflags & (State_Sunken | State_On | State_Raised))
proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, p, widget);
proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, p, widget);
} else if (toolbutton->features & QStyleOptionToolButton::HasMenu) {