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