QTabWidget with side shadows

From Qt Wiki
Revision as of 11:28, 24 March 2016 by Wieland (talk | contribs) (clean-up)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This TabWidget class provides side shadows for its tabs.

TabWidget.h

#ifndef TABWIDGET_H
#define TABWIDGET_H

#include <QTabWidget>
class QShowEvent;

class TabWidget : public QTabWidget
{
 Q_OBJECT

QWidget* leftShadow_;
 QWidget* rightShadow_;

void showEvent( QShowEvent* event );

public:
 explicit TabWidget( QWidget* parent = 0 );

private slots:
 void tabChanged( int tabNumber );
};

#endif // TABWIDGET_H

TabWidget.cpp

#include "TabWidget.h"
#include <QTabBar>

TabWidget::TabWidget( QWidget* parent ) :
 QTabWidget( parent ),
 leftShadow_( new QWidget( this ) ),
 rightShadow_( new QWidget( this ) )
{
 connect( this,
 SIGNAL (currentChanged( int ) ),
 SLOT( tabChanged( int ) ) );
 leftShadow_->setObjectName( "leftshadow" );
 leftShadow_->setFixedWidth( 10 );
 leftShadow_->setFixedHeight( tabBar()->height() );
 rightShadow_->setObjectName( "rightshadow" );
 rightShadow_->setFixedWidth( 10 );
 rightShadow_->setFixedHeight( tabBar()->height() );
}

void TabWidget::tabChanged( int tabNumber )
{
 const QTabBar* tabBar = this->tabBar();
 const QRect tabRect = tabBar->tabRect( tabNumber );
 if( tabNumber  0 )
    {
        leftShadow_->hide();
    }
    else
    {
        QPoint leftPos = tabBar->mapTo( this,
                                        tabRect.bottomLeft() );
        leftShadow_->setFixedHeight( tabRect.height() - 4 ); // '4' is the difference between active and inactive tabs heights
        leftShadow_->move( leftPos.x() - leftShadow_->width(),
                           leftPos.y() - leftShadow_->height() + 1  );
        leftShadow_->show();
    }
    if( tabNumber  ( count() - 1 ) )
 {
 rightShadow_->hide();
 }
 else
 {
 QPoint rightPos = tabBar->mapTo( this,
 tabRect.bottomRight() );
 rightShadow_->setFixedHeight( tabRect.height()- 4 );
 rightShadow_->move( rightPos.x(),
 rightPos.y()- rightShadow_->height() + 1 );
 rightShadow_->show();
 }
}

void TabWidget::showEvent ( QShowEvent * event )
{
 Q_UNUSED( event )
 tabChanged( currentIndex() );
}

Stylesheet for shadows

#leftshadow
{
 background-color: qlineargradient(spread:pad,x1:0.312,y1:0.419545,x2:1,y2:0,stop:0 rgba(0, 0, 0, 0),stop:0.817778 rgba(80, 80, 80, 193),stop:1 rgba(80, 80, 80, 255));
}
#rightshadow
{
 background-color: qlineargradient(spread:pad,x1:0.680,y1:0.419545,x2:0,y2:0,stop:0 rgba(0, 0, 0, 0),stop:0.817778 rgba(80, 80, 80, 193),stop:1 rgba(80, 80, 80, 255));
}