Qtのコントロール - タブ

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

Qtにおいて、QTabWidgetクラスを使用してタブをコントロールする手順を記載する。


タブ幅を揃える(等幅にする)

タブを追加すると、タブに表示するテキストの文字列長に応じて、自動的にタブ幅が調整される。
全てのタブ幅を等幅にするには、QTabBar::tabSizeHintメソッドをオーバーライドして、適切なQSizeクラスを指定することで実現できる。

QTabBarクラスを継承した派生クラスをQTabWidgetクラスに設定するには、QTabWidget::setTabBarメソッドを使用すればよいが、
QTabWidget::setTabBarメソッドはprotectedであるため、QTabWidgetクラスを継承した派生クラスも作成する必要がある。

以下の例では、QTabBarクラスを継承したQTabBarExクラス、QTabWidgetクラスを継承したQTabWidgetExクラスを作成している。
また、Qt Designerにおいて、タブコントロールを右クリックして[格上げ先を指定]を選択後、QTabWidgetExクラスに格上げすること。

 // MainWindow.cpp
 
 #include "MainWindow.h"
 #include "ui_MainWindow.h"
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }


 // MainWindow.h
 
 #pragma once
 
 #include <QMainWindow>
 
 namespace Ui {class MainWindow;}
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
 
 public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
 private:
    Ui::MainWindow *ui;
 };


 // QTabBarEx.cpp
 
 QTabBarEx::QTabBarEx(QWidget *parent) : QTabBar(parent)
 {
 }
 
 QSize QTabBarEx::tabSizeHint(int index) const
 {
    QSize size = QTabBar::tabSizeHint(index);
 
    // QSizeクラスのコンストラクタの第1引数がタブ幅、第2引数がタブの高さとなる
    return QSize(100, size.height());
 }


 // QTabBarEx.h
 
 #pragma once
 
 #include <QTabBar>
 
 class QTabBarEx : public QTabBar
 {
 public:
    explicit QTabBarEx(QWidget *parent = Q_NULLPTR);
    ~QTabBarEx() override {}
 
 protected:
    QSize tabSizeHint(int) const override;
 };


 // QTabWidgetEx.cpp
 
 #include <memory>
 #include "QTabWidgetEx.h"
 
 QTabWidgetEx::QTabWidgetEx(QWidget *parent) : QTabWidget(parent)
 {
    std::unique_ptr<QTabBarEx> newTabBar = std::make_unique<QTabBarEx>(this);
 
    // QTabWidgetのソースコード(qtabwidget.cppファイルの237〜238行目)を参考にしている
    newTabBar->setObjectName(QLatin1String("qt_tabwidget_tabbar"));
    newTabBar->setDrawBase(false);
 
    setTabBar(newTabBar);
 }


 // QTabWidgetEx.h
 
 #include <QTabWidget>
 #include "QTabBarEx.h"
 
 class QTabWidgetEx : public QTabWidget
 {
 public:
    explicit QTabWidgetEx(QWidget *parent = Q_NULLPTR);
    ~QTabWidgetEx() {}
 };



任意のタブに閉じるボタンを表示しない

全てのタブに[閉じる]ボタンを表示する場合、以下の2つの方法がある。

  • Qt Designerで設定する場合
    プロパティ[tabsClosable]にチェックを入力する。
  • ソースコードで設定する場合
    以下のように記述する。
    ui->tabWidget->setTabsClosable(true);


任意のタブに[閉じる]ボタンを表示しない場合、ソースコードに以下を記述する。
setTabButtonメソッドの第1引数には、タブのインデックス(0オリジン)を指定する。

 QTabBar *tabBar = ui->tabWidget->tabBar();
 tabBar->setTabButton(0,
                      static_cast<QTabBar::ButtonPosition>(tabBar->style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, nullptr, tabBar)),
                      nullptr);