2014-09-24 117 views
0

我有自定義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

回答

0

看看這段代碼:

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