【问题标题】:QT Custom QStyle for QTabBar and QIconQTabBar 和 QIcon 的 QT 自定义 QStyle
【发布时间】:2014-09-24 14:40:19
【问题描述】:

我已经自定义了 Qtabbar 的 QMdiarea 以获取水平选项卡而不是垂直选项卡,如下所示: http://www.qtcentre.org/wiki/index.php?title=Customizing_QTabWidget%27s_QTabBar

但我想在我的 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

【问题讨论】:

    标签: qt styles qtabbar qicon


    【解决方案1】:

    看这段代码:

    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);
    

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2021-12-31
      相关资源
      最近更新 更多