QTabWidget with side shadows: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Category:snippets]][toc align_right="yes" depth="4"]
[[Category:snippets]][toc align_right="yes" depth="4"]


= TabWidget =
= TabWidget =
Line 7: Line 7:
==== TabWidget.h ====
==== TabWidget.h ====


<code>#ifndef TABWIDGET_H<br />#define TABWIDGET_H
<code>#ifndef TABWIDGET_H
#define TABWIDGET_H


#include &lt;QtGui/QTabWidget&amp;gt;<br />class QShowEvent;
#include <QtGui/QTabWidget>
class QShowEvent;


class TabWidget : public QTabWidget<br />{<br /> Q_OBJECT
class TabWidget : public QTabWidget
{
Q_OBJECT


QWidget* leftShadow_;<br /> QWidget* rightShadow_;
QWidget* leftShadow_;
QWidget* rightShadow_;


void showEvent( QShowEvent* event );
void showEvent( QShowEvent* event );


public:<br /> explicit TabWidget( QWidget* parent = 0 );
public:
explicit TabWidget( QWidget* parent = 0 );


private slots:<br /> void tabChanged( int tabNumber );<br />};
private slots:
void tabChanged( int tabNumber );
};


#endif // TABWIDGET_H<br /></code>
#endif // TABWIDGET_H
</code>


==== TabWidget.cpp ====
==== TabWidget.cpp ====


<code>#include &quot;TabWidget.h&amp;quot;<br />#include &lt;QtGui/QTabBar&amp;gt;
<code>#include "TabWidget.h"
#include <QtGui/QTabBar>


TabWidget::TabWidget( QWidget* parent ) :<br /> QTabWidget( parent ),<br /> leftShadow_( new QWidget( this ) ),<br /> rightShadow_( new QWidget( this ) )<br />{<br /> connect( this,<br /> SIGNAL (currentChanged( int ) ),<br /> SLOT( tabChanged( int ) ) );<br /> leftShadow_<s>&gt;setObjectName( &quot;leftshadow&amp;quot; );<br /> leftShadow_</s>&gt;setFixedWidth( 10 );<br /> leftShadow_<s>&gt;setFixedHeight( tabBar()</s>&gt;height() );<br /> rightShadow_<s>&gt;setObjectName( &quot;rightshadow&amp;quot; );<br /> rightShadow_</s>&gt;setFixedWidth( 10 );<br /> rightShadow_<s>&gt;setFixedHeight( tabBar()</s>&gt;height() );<br />}
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 )<br />{<br /> const QTabBar* tabBar = this-&gt;tabBar();<br /> const QRect tabRect = tabBar-&gt;tabRect( tabNumber );<br /> if( tabNumber  0 )
void TabWidget::tabChanged( int tabNumber )
     &amp;#123;
{
         leftShadow_-&amp;gt;hide();
const QTabBar* tabBar = this->tabBar();
     &amp;#125;
const QRect tabRect = tabBar->tabRect( tabNumber );
if( tabNumber  0 )
     {
         leftShadow_->hide();
     }
     else
     else
     &amp;#123;
     {
         QPoint leftPos = tabBar-&amp;gt;mapTo( this,
         QPoint leftPos = tabBar->mapTo( this,
                                         tabRect.bottomLeft() );
                                         tabRect.bottomLeft() );
         leftShadow_-&amp;gt;setFixedHeight( tabRect.height() - 4 ); // &amp;#39;4&amp;#39; is the difference between active and inactive tabs heights
         leftShadow_->setFixedHeight( tabRect.height() - 4 ); // &amp;#39;4&amp;#39; is the difference between active and inactive tabs heights
         leftShadow_-&amp;gt;move( leftPos.x() - leftShadow_-&amp;gt;width(),
         leftShadow_->move( leftPos.x() - leftShadow_->width(),
                           leftPos.y() - leftShadow_-&amp;gt;height() + 1  );
                           leftPos.y() - leftShadow_->height() + 1  );
         leftShadow_-&amp;gt;show();
         leftShadow_->show();
     &amp;#125;
     }
     if( tabNumber  ( count() - 1 ) )<br /> {<br /> rightShadow_<s>&gt;hide();<br /> }<br /> else<br /> {<br /> QPoint rightPos = tabBar</s>&gt;mapTo( this,<br /> tabRect.bottomRight() );<br /> rightShadow_<s>&gt;setFixedHeight( tabRect.height()</s> 4 );<br /> rightShadow_<s>&gt;move( rightPos.x(),<br /> rightPos.y()</s> rightShadow_<s>&gt;height() + 1 );<br /> rightShadow_</s>&gt;show();<br /> }<br />}
     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 )<br />{<br /> Q_UNUSED( event )<br /> tabChanged( currentIndex() );<br />}<br /></code>
void TabWidget::showEvent ( QShowEvent * event )
{
Q_UNUSED( event )
tabChanged( currentIndex() );
}
</code>


==== Stylesheet for shadows ====
==== Stylesheet for shadows ====


<code>#leftshadow<br />{<br /> 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));<br />}<br />#rightshadow<br />{<br /> 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));<br />}</code>
<code>#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));
}</code>


==== Example ====
==== Example ====

Revision as of 11:02, 25 February 2015

[toc align_right="yes" depth="4"]

TabWidget

This TabWidget class provides side shadows for its tabs.

TabWidget.h

#ifndef TABWIDGET_H
#define TABWIDGET_H

#include <QtGui/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 <QtGui/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 ); // &amp;#39;4&amp;#39; 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));
}

Example