QT定制将QStyle为QTabBar和QIcon

问题描述:

我有自定义Qtabbar的QMdiarea获得水平标签,而不是垂直的标签是这样的: http://www.qtcentre.org/wiki/index.php?title=Customizing_QTabWidget%27s_QTabBarQT定制将QStyle为QTabBar和QIcon

但我想在我的QTabBar插入图标。 如果我将自定义样式应用于我的QTabBar,我的图标不会出现。 如果我不申请,我的图标出现。

这里我自定义样式:

class CustomTabStyle : public QPlastiqueStyle 
{ 
    Q_OBJECT 
public: 
QSize sizeFromContents(ContentsType type, const QStyleOption *option,const QSize &size, const QWidget *widget) const 
{ 
    QSize s = QPlastiqueStyle::sizeFromContents(type, option, size, widget); 
    if (type == QStyle::CT_TabBarTab) 
     s.transpose(); 
    return s; 
} 
void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const 
{ 
    if (element == CE_TabBarTabLabel) 
    { 
     if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) 
     { 
      QStyleOptionTab opt(*tab); 
      opt.shape = QTabBar::RoundedNorth; 
      QPlastiqueStyle::drawControl(element, &opt, painter, widget); 
      return; 
     } 
    } 
    QPlastiqueStyle::drawControl(element, option, painter, widget); 
} 

};

和我申请我的风格是这样的:

mMdiAreaDock=aMdiArea; 
m_pMdiAreaTabBar = NULL; 
QObjectList listChildren = mMdiAreaDock->children(); 
for (QObjectList::Iterator i = listChildren.begin(); i != listChildren.end(); ++i) 
{ 
    if (QString((*i)->metaObject()->className()) == "QTabBar") 
    { 
     m_pMdiAreaTabBar = dynamic_cast<QTabBar*>(*i); 
     break; 
    } 
} 
m_pMdiAreaTabBar->setStyle(new CustomTabStyle()); 
return 0; 

其中mMdiAreaDock是QMdiArea 和m_pMdiAreaTabBar是QTabBar

看看这段代码:

const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)); 
QStyleOptionTab opt(*tab); 

option是一个实例的QStyleOptionTabV2

当您使用复制构造函数创建新对象QStyleOptionTab opt时,会丢失一些扩展的重要数据QStyleOptionTabV2包含有关图标的信息。

使用此代码来代替:

if (const QStyleOptionTabV2 *tab = qstyleoption_cast<const QStyleOptionTabV2 *>(option)) 
{ 
    QStyleOptionTabV2 opt(*tab); 
    opt.shape = QTabBar::RoundedNorth; 
    QPlastiqueStyle::drawControl(element, &opt, painter, widget); 
    return; 
} 

PS。我使用此代码为特定选项卡分配图标:

m_pMdiAreaTabBar->setTabIcon(0, icon); 
+0

谢谢你,它工作正常:) – Zennoi 2014-09-26 14:27:46