Qtをメインに、プログラムやITに関する情報を発信

Qtの戯言

QTabWidget

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

更新日:

QTabWidgetのタブ幅

QTabWidgetにタブを追加すると、タブテキストの文字列長に応じて、↓のように自動的にタブ幅が調整されます。
これを、全タブ等幅にするには、どうすれば良いのでしょうか?
(クリックで拡大)

 

QTabBar::tabSizeHint()をオーバーライド

QTabBar::tabSizeHint()をオーバーライドし、その中で適切なQSizeを返すようにすれば、実現できます。
QTabBarを継承したクラスのオブジェクトをQTabWidgetに設定するには、QTabWidget::setTabBar()を使用すれば良いのですが、残念ながらこの関数はprotectedであるため、QTabWidgetを継承したクラスも作成する必要があります。

 

サンプル

QTabBarを継承したTabBarクラスおよび、QTabWidgetを継承したTabWidgetクラスを作成しています。
サンプルなので、全てmainwindow.cpp / .h に詰め込んでいます。ご容赦ください。

デザイン画面で「Tab Widget」を貼り付け、右クリックメニューの「格上げ先を指定」より、作成したTabWidgetクラスに格上げしています。
(クリックで拡大)

 

#include "mainwindow.h"
#include "ui_mainwindow.h"

TabBar::TabBar(QWidget *parent) :
    QTabBar(parent)
{
}

QSize TabBar::tabSizeHint(int index) const
{
    QSize size = QTabBar::tabSizeHint(index);
    return QSize(100, size.height());
}

TabWidget::TabWidget(QWidget *parent) :
    QTabWidget(parent)
{
    TabBar *newTabBar = new TabBar(this);
    newTabBar->setObjectName(QLatin1String("qt_tabwidget_tabbar"));
    newTabBar->setDrawBase(false);
    setTabBar(newTabBar);
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

12行目の「100」の部分がタブ幅となります。
今回は高さは変更しないので、親クラスのQTabBar::tabSizeHint()で得た値をそのまま使用しています。

19~20行目に関しては、QtのQTabWidgetのソース(qtabwidget.cpp 237~238行目)を参考にしています。
※Qtを、ソースも合わせてCドライブ直下にインストールした場合のパスは、C:\Qt\5.12.0\Src\qtbase\src\widgets\widgets\qtabwidget.cpp です。

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTabBar>
#include <QTabWidget>

namespace Ui {
class MainWindow;
}

class TabBar : public QTabBar
{
public:
    explicit TabBar(QWidget *parent = Q_NULLPTR);
    ~TabBar() override {}

protected:
    QSize tabSizeHint(int) const override;
};

class TabWidget : public QTabWidget
{
public:
    explicit TabWidget(QWidget *parent = Q_NULLPTR);
    ~TabWidget() {}
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 

実行結果

-QTabWidget
-, ,

Copyright© Qtの戯言 , 2020 All Rights Reserved Powered by STINGER.