Qt 意外と使えるQTabBar

QTabWidgetのタブの部分だけのウィジェットとしてQTabBarというクラスがあります
このQTabBarは意外と実用的なクラスですがQt Designerで追加できるウィジェットには含まれていません。
そのため知名度は低いように思ったので紹介してみようと思います。

このウィジェットもQWidgetを継承しているクラスのため、その他のウィジェットと同じように他のウィジェット上に配置することができます。

とりあえずウィジェットの真ん中に配置すると見た目はこのような感じになります。
f:id:nukesaq88:20130411190621p:plain

タブの操作はQTabWidgetと同じように、
追加はaddTab関数やinsertTab関数で末尾に追加や途中への追加、
削除はremoveTabでインデックスを指定して削除、
というように操作可能です。
もちろんcurrentChangedシグナルも実装されているためカレントタブが変更されたことも通知してくれます。

またsetTabButtonという関数では、例えば"閉じるボタン"などのボタンをタブ上に追加が可能です。
ボタンの配置はLeftSideとRightSideを選ぶことができます。
ですが実はこの関数、TabButtonという関数名ですが引数で受けつけるのはQWidgetのポインタなので、
QWidgetを継承したウィジェットならばどんなウィジェットでも配置可能なのです。

下は使いどころがあるかは不明ですが、タブにQComboBoxとQCheckBoxを追加したサンプルです。
f:id:nukesaq88:20130411191341p:plain


このように利用用途がありそうなQTabBarですが、やはりQt Designerでformを作成している場合、Qt Designer上のフォームエディタでQTabBarも配置したいと考えるかと思います。
その場合、以下の方法で若干無理やりではありますがフォームエディタ上でQTabBarも配置できました。

下のようなフォームでButton1とButton2の間に配置したいとします。
f:id:nukesaq88:20130411193135p:plain

そこにQWidgetをリストからドラッグして追加します。
f:id:nukesaq88:20130411193244p:plain

追加したQWidgetを右クリックして"格上げ先を指定"を選択します。
f:id:nukesaq88:20130411193326p:plain

ここで立ち上がったダイアログで
ベースクラス名: QWidget
格上げされたクラス名: QTabBar
ヘッダファイル: QTabBar
と入力し、"追加"、"格上げ"ボタンを順に押します。
f:id:nukesaq88:20130411193446p:plain

ソースの方でタブをいくつか追加してみて実行します。
f:id:nukesaq88:20130411193711p:plain

これでフォームエディタからQTabBarを配置できました。


もし上記の方法で駄目だった場合、例えば下のようなQTabBarを継承しただけのカスタムクラスを作成し、そのクラスへウィジェットの格上げを行うことで
同じようにフォームエディタでの配置が可能だと思います。

mytabbar.h

#ifndef _MYTABBAR_H_
#define _MYTABBAR_H_
#include <QTabBar>
class MyTabBar : public QTabBar
{
public:
  explicit CustomTabBar( QWidget *parent = 0 ) : QTabBar( parent )
  {}
};
#endif // _MYTABBAR_H_

参考
QTabBar Class Reference | Documentation | Qt Project