当前位置: 代码迷 >> QT开发 >> 自定义QStyle的有关问题。详尽进贴~
  详细解决方案

自定义QStyle的有关问题。详尽进贴~

热度:91   发布时间:2016-04-25 04:54:48.0
自定义QStyle的问题。详尽进贴~~
最近做多国语言,将中英文翻译成法语,西班牙语。翻译之后的法语和西班牙语的字符数太多(英文只有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) {
  相关解决方案