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);
谢谢你,它工作正常:) – Zennoi 2014-09-26 14:27:46